0

我只是在我的 ghci 的一些讲义中使用了一个非常简单的示例:

 foldr (:) [] 1 2

期待结果

   [1,2]

但是,我得到一个错误。每次我尝试使用 ++ 或 : 作为给 foldr 的函数时都会出错。

显然我犯了一些非常明显的错误,但我似乎仍然找不到它。

任何人都可以帮忙吗?

4

1 回答 1

14

foldr通过传递两个参数12不是[1, 2].

当你遇到这样的麻烦时,只需检查函数的类型。你可以在 GHCi 中做到这一点:

Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b

所以你看到第一个参数应该是一个函数(a -> b -> b)。你用过(:),没关系你也可以检查部分应用函数的类型:

Prelude> :t (:)
(:) :: a -> [a] -> [a]

替换b[a]我们:

Prelude> :t foldr (:)
foldr (:) :: [a] -> [a] -> [a]

接下来,你给出了[]一个基本案例。

Prelude> :t foldr (:) []
foldr (:) [] :: [a] -> [a]

所以得到的函数是 type [a] -> [a]。你应该怎么做?您必须将列表传递给它才能获得列表!传递参数列表[1, 2]

Prelude> :t foldr (:) [] [1,2]
foldr (:) [] [1,2] :: Num a => [a]

被类型检查器接受并产生结果:

Prelude> foldr (:) [] [1,2]
[1,2]

我希望这有助于对您的程序进行类型调试...

于 2013-08-27T10:53:33.440 回答