Haskell 函数组合中的类型检查

Haskell 函数组合中的类型检查,haskell,Haskell,为什么我执行以下操作时ghci不抛出类型错误 let d = tail . head 这难道不是说尾巴想要[a],而头只给它一个吗?如果类型更专业,比如 head :: [Int] -> Int tail :: [Int] -> [Int] 那么tail.head就真的打不好了。 但就目前而言,这些类型是 head :: [a] -> a tail :: [b] -> [b] 我使用了类型变量“a”和“b”,这样你就不会认为它们必须是相同的。 在这种情况下,如果

为什么我执行以下操作时ghci不抛出类型错误

let d = tail . head

这难道不是说尾巴想要[a],而头只给它一个吗?

如果类型更专业,比如

head :: [Int] -> Int
tail :: [Int] -> [Int]  
那么tail.head就真的打不好了。 但就目前而言,这些类型是

head :: [a] -> a
tail :: [b] -> [b]
我使用了类型变量“a”和“b”,这样你就不会认为它们必须是相同的。 在这种情况下,如果a=[b],类型将变为

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

而且它们是可组合的。

因为列表的开头也可能是一个列表。如果你检查
d
的类型,你会看到它应该是
[[a]]->[a]
@SassaNF这是一个答案,为什么不把它贴出来呢?AA我明白了,这不是我第一次想不起来的:)