函数elem抛出错误

时间:2016-07-22 00:33:54

标签: haskell

我的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函数应该只返回一个列表。

2 个答案:

答案 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)

您传递的四个参数是0mapmod 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)]