如何推断 (.) 的类型。 (.)
是 (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)]
...
但这永远不会导致所需的类型。
出了什么问题?
最佳答案
表达式 (.) 。 (.)
表示 (.) (.) (.)
。要获取其类型,让我们从以下位置开始:
(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
(.) (.) :: ???
让我们将第二个 (.)
的类型进行 alpha 转换为 (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
一旦类型变量进行 alpha 转换。
关于haskell - 类型 (.) 。 (.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29054454/