首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell为什么[fst,snd]:[(a,a) -> a]

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

Stack Overflow用户
提问于 2016-02-23 11:23:19
回答 1查看 1.1K关注 0票数 10

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

代码语言:javascript
复制
[fst,snd] :: [(a,a) -> a]

我最初写的

代码语言:javascript
复制
[fst,snd] :: [(a,b) -> a, (c, d) -> d]

我不明白为什么会这样,有人能解释一下吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-23 11:40:36

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

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

代码语言:javascript
复制
 (a , b) -> a

代码语言:javascript
复制
 (a , b) -> b

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

代码语言:javascript
复制
 [b +-> a] -- means substitute occurrences of b for a

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

代码语言:javascript
复制
 (a,a) -> a

就像Haskell告诉你的。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35576239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档