Haskell为什么[fst,snd]:[(a,a)->;a]

Haskell为什么[fst,snd]:[(a,a)->;a],haskell,Haskell,我正在学习Haskell,我想知道为什么 [fst,snd] :: [(a,a) -> a] 我最初写的 [fst,snd] :: [(a,b) -> a, (c, d) -> d] 我不明白为什么会是这样;有人能解释一下吗 感谢重点是列表,在Haskell中,是一个同质的数据结构(当然,您可以有异质的列表,但这是另一回事)。因此,当您使用多态函数作为列表元素时,它们应该具有相同的类型 在本例中,您使用的是fst::(a,b)->a和snd::(a,b)->b作为列表元素,

我正在学习Haskell,我想知道为什么

[fst,snd] :: [(a,a) -> a]
我最初写的

[fst,snd] :: [(a,b) -> a, (c, d) -> d]
我不明白为什么会是这样;有人能解释一下吗


感谢

重点是列表,在Haskell中,是一个同质的数据结构(当然,您可以有异质的列表,但这是另一回事)。因此,当您使用多态函数作为列表元素时,它们应该具有相同的类型

在本例中,您使用的是
fst::(a,b)->a
snd::(a,b)->b
作为列表元素,因此它们必须具有相同的类型。为了保证这些类型的一致性,类型推理采用一阶统一。统一

 (a , b) -> a

我们注意到,以下替换使这些类型相等

 [b +-> a] -- means substitute occurrences of b for a
将其应用于这两种类型,我们得到

 (a,a) -> a

正如哈斯克尔告诉你的

你明白为什么
[“abc”,“def”]:[String]
?是的,但让我困惑的是
(fst,snd):((a,b)->a,(a1,b1)->b1)
,为什么列表不一样?好吧,我现在明白了,列表中只能有相同的类型,所以无论是第一个还是第二个,它仍然是一个?这是正确的解释吗?@是的,列表是同质的,这意味着它们只能包含相同类型的元素。这里,类型
fst::(a,b)->a
snd::(a,b)->b
专用于一个公共类型,因此它们可以放在同一个列表中。这种常见类型出现在
a=b
时,因此GHC推断为。谢谢,这为我澄清了很多。
 (a,a) -> a