Haskell为什么是[fst,snd] :: [(a,a) - >一个]

时间:2016-02-23 11:23:20

标签: haskell

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

[fst,snd] :: [(a,a) -> a]

我最初写的

[fst,snd] :: [(a,b) -> a, (c, d) -> d]

我无法理解为什么会这样;有人可以解释一下吗?

由于

1 个答案:

答案 0 :(得分:12)

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

在您的情况下,您使用fst :: (a , b) -> asnd :: (a, b) -> b作为列表元素,因此必须具有相同的类型。为了确保这些类型的相同性,类型推断依赖于一阶统一。统一

 (a , b) -> a

 (a , b) -> b

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

 [b +-> a] -- means substitute occurrences of b for a

将它应用于这两种类型,我们得到

 (a,a) -> a

正如Haskell告诉你的那样。