在简单的情况下解密Haskell类型的错误消息

Rum*_*mca 2 haskell

什么情况表示[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)

Dan*_*zer 8

所以类型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)