我在Ghci中尝试了:t head sum
并获得了类型错误结果。
对于我自己的想法,它应该是[int] -> int
。
此外,我在Ghci中尝试:t sum head
并获得a
结果。
我对这些答案感到困惑。 有人可以帮我搞清楚吗?
head
和sum
功能如下所示:
head :: [a] -> a
sum :: [Int] -> Int
答案 0 :(得分:3)
对于第一个:head
需要一个列表,sum
是一个函数。因此,它们无法应用。
关于第二个:使用新的GHC 7.10类重新设计,sum head
类型检查,但是有一个无用的类型:
> :t sum head
sum head :: (Num a, Foldable ((->) [a])) => a
请注意约束Foldable ((->) [a])
。为了实现这种约束,我们需要粗略地定义来自
[a] -> b
和
[b]
可选择b
。这不可能真的完成,因此sum head
实际上并不可用。
答案 1 :(得分:0)
我试过:在Ghci中输入总和并获得类型错误结果。
head
返回列表的第一个元素,sum将num列表减少为单个num。由于head取一个列表,它不能将一个int作为参数,这就是head sum
抛出类型错误的原因。
请注意,您没有在ghci中正确检查它,总和的类型是:
Prelude> :t sum
sum :: Num a => [a] -> a
另外,我已经尝试过:在Ghci中总结并获得结果。
如您所见,head
的类型为[a] -> a
,而且类型为Num a => [a] -> a
,因此如果head
返回a
并认为{ {1}}可以是任何类型,包括a
或简体中文,Num a => [a]
可以使用的数字列表,sum
将减少它并返回{ {1}}(这是一个数字)。
因此,sum
的类型为:
a
映射到上一个解释,sum . head
中的Prelude> :t sum . head
sum . head :: Num c => [[c]] -> c
现在为[a]
,来自head
的{{1}}为[c]
,我们之前[a]
的最终返回结果是sum
,也是一个数字(数字)。