什么情况表示[t0] -> a0 -> [a1]在此错误消息?我才意识到我必须申请(:)到foldr.为什么编译器不抱怨(*2)期望某种类型*的参数?
Prelude> foldr (:) . (* 2) [] [1..10]
<interactive>:141:19:
Couldn't match expected type `[t0] -> a0 -> [a1]'
with actual type `[a2]'
In the first argument of `* 2', namely `[]'
In the second argument of `(.)', namely `(* 2) [] [1 .. 10]'
In the expression: foldr (:) . (* 2) [] [1 .. 10]
Run Code Online (Sandbox Code Playgroud)
所以类型foldr是
foldr :: (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)
所以你传递它(:)所以它的类型变成了
foldr (:) :: [a] -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
但是,然后你尝试用它来组合它(*2) [] [1..10].这甚至没有很好的打字,所以你有麻烦.我认为你的问题是函数应用程序是所有人的最高优先级.
foldr ((:) . (*2)) [] [1..10]
Run Code Online (Sandbox Code Playgroud)
明确的parens是必要的.
顺便说一下,你可以使用
map (*2) [1..10]
Run Code Online (Sandbox Code Playgroud)