为什么(总和)会导致类型错误? (Haskell的)

时间:2015-12-05 10:49:45

标签: haskell typing

我在Ghci中尝试了:t head sum并获得了类型错误结果。

对于我自己的想法,它应该是[int] -> int

此外,我在Ghci中尝试:t sum head并获得a结果。

我对这些答案感到困惑。 有人可以帮我搞清楚吗?

headsum功能如下所示:

head :: [a] -> a

sum :: [Int] -> Int

2 个答案:

答案 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,也是一个数字(数字)。