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

zur*_*rab 10 recursion haskell 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
Run Code Online (Sandbox Code Playgroud)

我想尝试一下.我把代码放在Hof.hs文件中,运行ghci(版本7.8.3),输入

:l Hof.hs
Run Code Online (Sandbox Code Playgroud)

并收到以下错误消息

Hof.hs:3:7: Parse error in pattern: n + 1
Failed, modules loaded: none.

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

rig*_*old 19

n + k模式已从Haskell中删除,不再可用.写它像这样:

even :: Int -> Bool
even 0 = True
even n = odd (n - 1)

odd :: Int -> Bool
odd 0 = False
odd n = even (n - 1)
Run Code Online (Sandbox Code Playgroud)

请注意,对于负输入,此函数可能会失败,因此您可能希望使用它来扩充它abs.

  • 我认为这是真正关注自然数字并使用`Int`以方便起见.引入`abs`可能没有意义.更好的是使用Peano自然:`数据Nat = Zero | Succ Nat`,然后`甚至Zero = True; even(Succ n)=奇数n; 奇零=假; 奇数(Succ n)=偶数n`. (2认同)