如何有效地两次使用这个计算的结果?
我对 Haskell 比较陌生,目前正在做我的第一个项目。我写了一个函数,它根据对另一个函数的调用返回一些东西,它再次调用这个函数(所以它是递归的)。
function :: a -> a
function a
| null (recursive call) = a
| otherwise = head (same recursive call)
如何只进行一次递归调用并使用两次结果(作为条件和“返回值”的一部分)?
回答
function a
| null recCall = a
| otherwise = head recCall
where recCall = recursive call
但这不是一个好方法。避免使用head, tail, !!。通常有一种叫做“布尔盲点”的东西:使用布尔值意味着程序基本上忘记了你的逻辑所基于的含义,这意味着你需要重新引入它,这会使你的程序变得更加冗长和不可靠。
最好立即对递归结果使用模式匹配:
function a = case recursive call of
[] -> a
(h:_) -> h
这也可以用模式保护语法编写
function a
| (h:_) <- recursive call = h
| otherwise = a