在Graham Hutton的“Haskell编程”的第6章中,有一节名为“6.5 Mutual recursion”,其中包含以下示例:
even :: Int -> Bool
even 0 = True
even (n + 1) = odd n
odd :: Int -> Bool
odd 0 = False
odd (n + 1) = even n
我想尝试一下。我把代码放在Hof.hs文件中,运行 ghci (版本7.8.3),键入
:l Hof.hs
并收到以下错误消息
Hof.hs:3:7: Parse error in pattern: n + 1 Failed, modules loaded: none.
为什么我收到此消息?代码是否在语法上过时了?
答案 0 :(得分:18)
n + k patterns have been removed已不再可用。这样写它:
even :: Int -> Bool
even 0 = True
even n = odd (n - 1)
odd :: Int -> Bool
odd 0 = False
odd n = even (n - 1)
请注意,此功能对于负输入非常失败,因此您可能希望使用abs
对其进行扩充。
答案 1 :(得分:0)
我们自己的语言非常强大。在我自学微积分时,我遇到了极限,直到我读了一段牛顿中的一句话。当然,这是英文版。
首先,您对未使用或不需要的索引是正确的。
其次,代码不知道偶数或奇数之间的区别,你再次对它提出质疑。
最后,我稍微修改了这些,以便在我的实现上正常工作。
evens [x] = [x]; evens (x:xs) = x:odds xs
odds [x] = []; odds (_:xs) = evens xs
它们如何工作evens
完成工作。它构建输出列表。它接受列表的第一项并使其成为输出列表的第一项或下一项。它使用列表的其余部分调用odds
。 odds
只会将收到的内容返回evens
。
与尾巴一样,它会丢弃它收到的第一项。
evens
生成一个列表,其中大约有一半的项目被丢弃。 odds
只产生关键的丢弃物。
如果你给evens
列表[0,1,2,3,4]它会返回从0开始的所有其他项目,即[0,2,4]。如果你给evens列表[1,2,3,4]它返回[1,3],因为列表以奇数开头。 evens
开始的地方,就是它产生的东西。
尝试使用[1,1,1,1,1]或“bcdefg”
对函数所做的修改分别反映了每个函数对剩余元素的作用。赔率丢弃它,evens将它附加到输出列表的末尾。
如果给出以偶数开头的列表,这两个函数只能正常工作。如果给出一个带有奇数的列表,它们就会反向运行。
这是一个函数,它将根据指定的起始编号生成偶数或奇数列表,并以指定的结束编号结束。
eo s e = [s,s+2..e]