我是学习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模式匹配,如何修改教科书示例以遵循现代良好实践?
简而言之,我现在知道为什么原版不起作用,但怎么能改变它的作用呢?
答案 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中定义。