我正在学习Haskell,我想知道为什么
[fst,snd] :: [(a,a) -> a]
我最初写的
[fst,snd] :: [(a,b) -> a, (c, d) -> d]
我无法理解为什么会这样;有人可以解释一下吗?
由于
答案 0 :(得分:12)
关键是Haskell中的列表是一个同构数据结构(当然,你可以有异构列表,但这是另一个故事)。因此,当您使用多态函数作为列表元素时,它们应该具有相同的类型。
在您的情况下,您使用fst :: (a , b) -> a
和snd :: (a, b) -> b
作为列表元素,因此必须具有相同的类型。为了确保这些类型的相同性,类型推断依赖于一阶统一。统一
(a , b) -> a
和
(a , b) -> b
我们注意到以下替换使这些类型相等
[b +-> a] -- means substitute occurrences of b for a
将它应用于这两种类型,我们得到
(a,a) -> a
正如Haskell告诉你的那样。