递归数学运算符模式中的解析误差

Mic*_*ris 0 haskell

我是学习Haskell的学生.我的教科书以下面的例子为例:

(*) :: Int -> Int -> Int
m * 0 = 0
m * (n + 1) = m + (m * n)
Run Code Online (Sandbox Code Playgroud)

然后它要求我们以相同的方式重新定义^(正整数取幂)运算符.我假设以下内容可行:

(^) :: Int -> Int -> Int
m ^ 0 = 1
m ^ (n + 1) = m * (m ^ n)
Run Code Online (Sandbox Code Playgroud)

但是,它无法编译,在该(n + 1)位上给出"模式中的解析错误" .出于好奇,我尝试了本书示例中定义的乘法运算符,并给出了相同的错误.

教科书在哪里/如何出错,我该如何纠正呢?

编辑

感谢那些指出这个问题在几年前得到解决的人.由于删除了n + k模式匹配的"特征",我如何修改教科书示例以遵循现代良好实践?

简而言之,我现在知道为什么原件不起作用,但它怎么能改变工作呢?

che*_*ner 5

您只需更换nn-1在等式的两边:

(*) :: Int -> Int -> Int
m * 0 = 0
m * ((n-1) + 1) = m + (m * (n-1))
Run Code Online (Sandbox Code Playgroud)

这是无效的语法,但当然"简化"到正确的版本

(*) :: Int -> Int -> Int
m * 0 = 0
m * n = m + (m * (n-1))
Run Code Online (Sandbox Code Playgroud)