使用foldr的非常基本的任务

时间:2013-08-27 10:32:15

标签: haskell fold

我刚用了一些非常简单的例子用于我的ghci的一些讲义:

 foldr (:) [] 1 2

期待结果

   [1,2]

但是,我收到了一个错误。每当我尝试使用++或:作为赋予foldr的函数时,我都会收到错误。

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:14)

您使用foldr类似于可变参数函数,方法是将12两个参数传递给[1, 2]

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

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

所以你看到第一个参数应该是一个函数(a -> b -> b)。您使用了(:),即o.k.您也可以检查部分应用函数的类型:

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

b替换[a]给我们:

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

接下来,您将[]作为基本案例。

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

因此生成的函数的类型为[a] -> [a]。你应该怎么做?你必须传递一个列表才能获得一个列表!传递参数列表[1, 2]

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

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

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

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