首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(.)类型(.)

(.)类型(.)
EN

Stack Overflow用户
提问于 2015-03-14 21:32:01
回答 1查看 105关注 0票数 4

如何推断(.) . (.)的类型是(b -> c) -> (a -> a1 -> b) -> a -> a1 -> c

(我的想法显然是错误的:(.)的类型是(t2->t3) -> (t1->t2) -> t1 -> t3,它应该与(t2->t3) -> [(t1->t2) -> (t1->t3)]相同(也使用[]{}来提高可读性)。因此,(.) . (.)的类型应该类似于{(b2->b3) -> [(b1->b2) -> (b1->b3)]} -> {(a2->a3) -> [(a1->a2) -> (a1->a3)]},它需要(b2->b3)来匹配[(a1->a2) -> (a1->a3)].

但这永远不会导致想要的类型。

怎么啦?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-14 21:48:23

表达式(.) . (.)表示(.) (.) (.)。要获得它的类型,让我们从以下位置开始:

代码语言:javascript
运行
复制
(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
(.)    (.)        :: ???

让我们将第二个(.)的类型转换为(a2 -> a3) -> (a1 -> a2) -> a1 -> a3。这种类型是t2 -> t3,所以我们得到

代码语言:javascript
运行
复制
t2 = a2 -> a3
t3 = (a1 -> a2) -> a1 -> a3

因此,

代码语言:javascript
运行
复制
(.) (.) :: (t1 -> t2) -> t1 -> t3    with the above t2,t3
(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3

现在,

代码语言:javascript
运行
复制
(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3
(.) (.)    (.)              :: ???

让第三个(.)具有(b2 -> b3) -> (b1 -> b2) -> b1 -> b3类型。这是t1 -> a2 -> a3,所以我们

代码语言:javascript
运行
复制
t1 = b2 -> b3
a2 -> a3 = (b1 -> b2) -> b1 -> b3

因此

代码语言:javascript
运行
复制
t1 = b2 -> b3
a2 = b1 -> b2
a3 = b1 -> b3

结论:

代码语言:javascript
运行
复制
(.) (.) (.) :: t1 -> (a1 -> a2) -> a1 -> a3   with the above t1,a2,a3
(.) (.) (.) :: (b2 -> b3) -> (a1 -> b1 -> b2) -> a1 -> b1 -> b3

哪种类型是您期望的类型?

代码语言:javascript
运行
复制
               (b  -> c ) -> (a  -> a1 -> b ) -> a  -> a1 -> c

一旦类型变量被α转换。

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

https://stackoverflow.com/questions/29054454

复制
相关文章

相似问题

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