类型是什么?(.) . (.)

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)] 匹配...

但这永远不会导致期望的类型。

哪里出了问题?

1个回答

9
表达式(.) . (.)表示(.) (.) (.)。为了获得它的类型,让我们从以下内容开始:
(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
(.)    (.)        :: ???

让我们对第二个 (.) 的类型进行 alpha-convert,转换为 (a2 -> a3) -> (a1 -> a2) -> a1 -> a3。这个类型是 t2 -> t3,因此我们得到

t2 = a2 -> a3
t3 = (a1 -> a2) -> a1 -> a3

因此,
(.) (.) :: (t1 -> t2) -> t1 -> t3    with the above t2,t3
(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3

现在,

(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3
(.) (.)    (.)              :: ???

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

t1 = b2 -> b3
a2 -> a3 = (b1 -> b2) -> b1 -> b3

因此
t1 = b2 -> b3
a2 = b1 -> b2
a3 = b1 -> b3

总结:

(.) (.) (.) :: t1 -> (a1 -> a2) -> a1 -> a3   with the above t1,a2,a3
(.) (.) (.) :: (b2 -> b3) -> (a1 -> b1 -> b2) -> a1 -> b1 -> b3

你期望的类型是什么?
               (b  -> c ) -> (a  -> a1 -> b ) -> a  -> a1 -> c

一旦类型变量进行了α转换。

你的第二个文本块中的t1应该是t2 - Thomas M. DuBuisson
@ThomasM.DuBuisson 谢谢。已修复。 - chi
你说得对,这就是该怎么做的。非常感谢 :D - dmw64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接