这个问题在这里已有答案:
我正在努力学习一下Haskell For Great Good,并试图解决递归章节中的一些示例问题 .
我正在尝试编写一个带有下限“a”和上限“b”的函数,并返回两者之间所有数字的总和 .
我最初尝试(我认为是)一种直接的方法
sumInts :: Int -> Int -> Int
sumInts a a = a
sumInts a b = (sumInts (a) (b-1)) + b
当我尝试编译时,我得到了一个错误声明
•'a'的定义冲突
我最终只想让这个东西起作用,所以我把应该是一个功能分成了两个 .
sumInts' :: Int -> Int
sumInts' 0 = 0
sumInts' a = sumInts' (a-1) + a
sumInts :: Int -> Int -> Int
sumInts 0 b = sumInts' b
sumInts a b = (sumInts (a-1) (b)) - (a-1)
我试着寻找你认为会是一个非常简单的问题 . 唉,结果似乎太小众了 .
如何将我目前拥有的两个功能合并到一个功能中?另外,为什么我原来的功能不起作用?关于如何在将来避免这种情况的任何提示?谢谢!
2 回答
Haskell中的模式匹配是线性的 . 这意味着在函数的头部(模式匹配部分)中不能写入两次变量 . 所以你的条款:
不被允许 . 在这种情况下,你可以 use guards :
警卫是管道角色之后的条件(
|
) . 如果满足条件,则函数将评估等号右侧的部分(=
) .otherwise
只是True
的别名 .我知道问题是关于递归,但是只使用一个函数的最简单方法是根本不使用递归,而是使用简单的数学公式 .