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

时间:2016-11-02 21:42:32

标签: haskell

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

(*) :: Int -> Int -> Int
m * 0 = 0
m * (n + 1) = m + (m * n)

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

(^) :: Int -> Int -> Int
m ^ 0 = 1
m ^ (n + 1) = m * (m ^ n)

然而,它无法编译,在模式中给出了一个解析错误'在(n + 1)位。出于好奇,我尝试了本书例子中定义的乘法运算符,它也给出了同样的错误。

教科书在哪里/如何出错?如何更正?

修改

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

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

2 个答案:

答案 0 :(得分:5)

您只需在等式的两边用n替换n-1

(*) :: Int -> Int -> Int
m * 0 = 0
m * ((n-1) + 1) = m + (m * (n-1))

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

(*) :: Int -> Int -> Int
m * 0 = 0
m * n = m + (m * (n-1))

答案 1 :(得分:3)

如果您不想使用NPlusKPatterns扩展,那么您可以写:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JaxbAnnotationModule());
List<PojoTO>response = mapper.readValue(result.readEntity(String.class), mapper.getTypeFactory().constructCollectionType(List.class, PojoTO.class));

import Prelude hiding ((^)) (^) :: Int -> Int -> Int m ^ 0 = 1 m ^ n = m * (m ^ (n - 1)) 避免了(^)的重复定义,因为它已在Prelude中定义。