函数组合中的类型检查

4
为什么当我执行以下命令时,ghci没有抛出类型错误?
let d = tail . head

这里应该说尾部想要 [a],而头部只给了一个 a?


2
因为列表的头部也可能是一个列表。如果你检查 d 的类型,你会发现它应该是 [[a]] -> [a] - Sassa NF
@SassaNF 这是一个答案,为什么不直接发布呢? - Fred Foo
1个回答

8
如果类型更加专业化,例如:
head :: [Int] -> Int
tail :: [Int] -> [Int]  

如果tail.head不是正确类型,那么代码确实存在问题。 但是根据现有的情况,类型是正确的

head :: [a] -> a
tail :: [b] -> [b]

我使用了类型变量“a”和“b”,以便您不认为它们必须相同。在这种情况下,如果a = [b],则类型变成

head :: [[b]] -> [b]
tail :: [b] -> [b]

它们是可组合的。


我明白了,这不是我第一次忘记考虑到那个问题 :) - user3139545

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接