我只是在我的 ghci 的一些讲义中使用了一个非常简单的示例:
foldr (:) [] 1 2
期待结果
[1,2]
但是,我得到一个错误。每次我尝试使用 ++ 或 : 作为给 foldr 的函数时都会出错。
显然我犯了一些非常明显的错误,但我似乎仍然找不到它。
任何人都可以帮忙吗?
您foldr
通过传递两个参数1
而2
不是[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]
我希望这有助于对您的程序进行类型调试...