t2 = (\x y z-> x.y.x)
GHCI向我展示了这一点:
t2 :: (b1 -> b2) -> (b2 -> b1) -> p -> b1 -> b2
我不太了解这种类型签名的产生方式。到目前为止,我已经知道最右边的x基本上是一个函数,它接受一个b2
并返回一个b1
,然后b1
是中间函数{{1 }},并再次输出y
?它是否不应该返回新类型b2
或其他类型的值?
答案 0 :(得分:5)
首先,让我们以一种清楚表明哪个参数对应于类型签名的哪一部分的方式来重写它:
t2 :: (b1->b2) -> (b2->b1) -> p -> b1 -> b2
t2 x y z = x . y . x
z :: p
根本没有使用,因此我们可以轻松地通过考虑而消除
t3 :: (b1->b2) -> (b2->b1) -> b1 -> b2
t3 x y = x . y . x
为什么是这种类型?好吧,合成链将x
的结果反馈到y
,并将y
的结果反馈给x
。换句话说,y
使您从x
的结果类型返回到x
的参数类型。因此,y
的类型必须是x
的“倒置”类型。所以
t3 :: (m->n) -> (n->m) -> ?
t3 x y = x . y . x
合成的类型由“外端”控制,即,参数必须是x
的参数类型,结果必须是...的结果类型,{{1 }}。因此
x
GHCi告诉您的是带有重命名的类型变量。