我的Haskell代码如下
isNotPrime x = elem 0 map (mod x)[3.. (x-1)]
编译时会显示这些错误
Couldn't match expected type ‘(t1 -> t1) -> [t1] -> t’
with actual type ‘Bool’
The function ‘elem’ is applied to four arguments,
but its type ‘([a0] -> [b0])
-> ((a0 -> b0) -> [a0] -> [b0]) -> Bool’
has only two
In the expression: elem 0 map (mod x) [3 .. (x - 1)]
In an equation for ‘prime’:
prime x = elem 0 map (mod x) [3 .. (x - 1)]
我的理解是elem接受两个参数,我不明白我如何在上面的代码中传递4个参数,因为map函数应该只返回一个列表。
答案 0 :(得分:8)
你 将四个参数传递给elem
函数。函数应用程序始终关联左侧,因此表达式
f a b c d
解析如下:
((((f a) b) c) d)
因此,您的示例将被解析为:
((((elem 0) map) (mod x)) [3.. (x-1)])
也就是说,elem
正在“应用于四个参数”,但当然所有Haskell函数实际上只是一个参数的函数,只是咖喱。您实际想要的是一个不同的分组,所以您只需要添加一些括号:
elem 0 (map (mod x) [3.. (x-1)])
或者,你可以use $
to avoid writing the parentheses:
elem 0 $ map (mod x) [3.. (x-1)]
或者你可以写elem
infix,这是Haskell中常见的习语。与$
一样,这也会将优先级更改为您想要的内容:
0 `elem` map (mod x) [3.. (x-1)]
答案 1 :(得分:2)
您传递的四个参数是0
,map
,mod x
和[3.. (x-1)]
。您打算将mod x
和[3.. (x-1)]
作为参数传递给map
,然后将结果作为第二个参数传递给elem
,但是Haskell没有办法知道没有括号或$
。因此,要使代码工作,请添加它们:
isNotPrime x = elem 0 (map (mod x) [3.. (x-1)])
-- or
isNotPrime x = elem 0 $ map (mod x) [3.. (x-1)]
或者您可以使用中缀表示法,在这种情况下,优先级规则(前缀函数应用程序比任何中缀运算符更紧密)都不需要括号:
isNotPrime x = 0 `elem` map (mod x) [3.. (x-1)]