我刚用了一些非常简单的例子用于我的ghci的一些讲义:
foldr (:) [] 1 2
期待结果
[1,2]
但是,我收到了一个错误。每当我尝试使用++或:作为赋予foldr的函数时,我都会收到错误。
显然我犯了一些非常明显的错误,但我似乎仍然无法找到它。
有人可以帮忙吗?
答案 0 :(得分:14)
您使用foldr
类似于可变参数函数,方法是将1
和2
两个参数传递给[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]
我希望这有助于对程序进行类型调试......