我的Haskell代码如下
isNotPrime x = elem 0 map (mod x)[3.. (x-1)]
Run Code Online (Sandbox Code Playgroud)
编译时会显示这些错误
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)]
Run Code Online (Sandbox Code Playgroud)
我的理解是elem接受两个参数,我不明白我如何在上面的代码中传递4个参数,因为map函数应该只返回一个列表.
您正在向elem函数传递四个参数.函数应用程序始终关联左,所以表达式
f a b c d
Run Code Online (Sandbox Code Playgroud)
解析如下:
((((f a) b) c) d)
Run Code Online (Sandbox Code Playgroud)
因此,您的示例将被解析为:
((((elem 0) map) (mod x)) [3.. (x-1)])
Run Code Online (Sandbox Code Playgroud)
也就是说,elem正在"应用于四个参数",但当然所有Haskell函数实际上只是一个参数的函数,只是咖喱.你真正想要的是一个不同的分组,所以你只需要添加一些括号:
elem 0 (map (mod x) [3.. (x-1)])
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用$以避免编写括号:
elem 0 $ map (mod x) [3.. (x-1)]
Run Code Online (Sandbox Code Playgroud)
或者你可以写中elem缀,这是Haskell中常见的习语.比如$,这也会改变你想要的优先级:
0 `elem` map (mod x) [3.. (x-1)]
Run Code Online (Sandbox Code Playgroud)