Haskell 类型(.)。(.)
如何推断Haskell 类型(.)。(.),haskell,types,Haskell,Types,如何推断(.)的类型。()是(b->c)->(a->a1->b)->a->a1->c (我的想法显然是错误的:()的类型是(t2->t3)->(t1->t2)->t1->t3,这应该与(t2->t3)->[(t1->t2)->(t1->t2)->(t1->(t1->t3)->(也使用[[{}的可读性)。因此,()的类型应该类似于{(b2 b3)->[(b1 b2->b2 b2)->(b1->b3)]}->{(a2->a3)->[(a1->a2)->(a1->a3)]}这需要(b2->b3)来匹配
(.)的类型。()
是(b->c)->(a->a1->b)->a->a1->c
(我的想法显然是错误的:()
的类型是(t2->t3)->(t1->t2)->t1->t3
,这应该与(t2->t3)->[(t1->t2)->(t1->t2)->(t1->(t1->t3)->(也使用[[{}
的可读性)。因此,()
的类型应该类似于{(b2 b3)->[(b1 b2->b2 b2)->(b1->b3)]}->{(a2->a3)->[(a1->a2)->(a1->a3)]}
这需要(b2->b3)
来匹配[(a1->a2)->(a1->a3)]
但这永远不会导致想要的类型
怎么了?表达式(.)的意思是(.)
。要获取其类型,让我们从以下内容开始:
(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
(.) (.) :: ???
让我们将second(.)
的类型alpha转换为(a2->a3)->(a1->a2)->a1->a3
。这种类型是t2->t3
,因此我们得到
t2 = a2 -> a3
t3 = (a1 -> a2) -> a1 -> a3
t1 = b2 -> b3
a2 -> a3 = (b1 -> b2) -> b1 -> b3
因此,
(.) (.) :: (t1 -> t2) -> t1 -> t3 with the above t2,t3
(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3
现在,
让第三个()
具有类型(b2->b3)->(b1->b2)->b1->b3
。
这是t1->a2->a3
,所以我们得到
t2 = a2 -> a3
t3 = (a1 -> a2) -> a1 -> a3
t1 = b2 -> b3
a2 -> a3 = (b1 -> b2) -> 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。t1
在第二个文本块中应该是t2
@thomas.DuBuisson谢谢。修复。您是对的,这就是必须做的。非常感谢:D