我正在学习Haskell,我想知道为什么
[fst,snd] :: [(a,a) -> a]我最初写的
[fst,snd] :: [(a,b) -> a, (c, d) -> d]我不明白为什么会这样,有人能解释一下吗?
谢谢
发布于 2016-02-23 11:40:36
关键是,在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告诉你的。
https://stackoverflow.com/questions/35576239
复制相似问题