haskell中奇数/偶数函数的相互递归

时间:2015-02-10 12:00:25

标签: haskell recursion ghci

在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.

为什么我收到此消息?代码是否在语法上过时了?

2 个答案:

答案 0 :(得分:18)

来自Haskell的

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完成工作。它构建输出列表。它接受列表的第一项并使其成为输出列表的第一项或下一项。它使用列表的其余部分调用oddsodds只会将收到的内容返回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]