类型 (.) .(.)

dmw*_*w64 4 haskell types

一个人如何可以推断的类型(.) . (.)是(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)]...

但这永远不会导致所需的类型.

怎么了?

chi*_*chi 9

表达(.) . (.)意味着(.) (.) (.).要获得它的类型,让我们从:

(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
(.)    (.)        :: ???
Run Code Online (Sandbox Code Playgroud)

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

t2 = a2 -> a3
t3 = (a1 -> a2) -> a1 -> a3
Run Code Online (Sandbox Code Playgroud)

因此,

(.) (.) :: (t1 -> t2) -> t1 -> t3    with the above t2,t3
(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3
Run Code Online (Sandbox Code Playgroud)

现在,

(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3
(.) (.)    (.)              :: ???
Run Code Online (Sandbox Code Playgroud)

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

t1 = b2 -> b3
a2 -> a3 = (b1 -> b2) -> b1 -> b3
Run Code Online (Sandbox Code Playgroud)

于是

t1 = b2 -> b3
a2 = b1 -> b2
a3 = b1 -> b3
Run Code Online (Sandbox Code Playgroud)

结论:

(.) (.) (.) :: t1 -> (a1 -> a2) -> a1 -> a3   with the above t1,a2,a3
(.) (.) (.) :: (b2 -> b3) -> (a1 -> b1 -> b2) -> a1 -> b1 -> b3
Run Code Online (Sandbox Code Playgroud)

这是你期望的类型

               (b  -> c ) -> (a  -> a1 -> b ) -> a  -> a1 -> c
Run Code Online (Sandbox Code Playgroud)

一旦类型变量被alpha转换.