这个haskell双函数组合的类型是什么?

What is the type of this haskell double function composition?

t2 = (\x y z-> x.y.x)

GHCI 向我展示了这个:

t2 :: (b1 -> b2) -> (b2 -> b1) -> p -> b1 -> b2

我不太明白这个类型签名是怎么来的。到目前为止,我认为最右边的 x 基本上是一个函数,它接受一个 b2 和 return 一个 b1,然后 b1 是中间的输入函数 y,并再次输出 b2?它不应该 return 一个新类型的值 b3 或者什么的吗?

首先,让我们以一种明确哪个参数对应于类型签名的哪个部分的方式重写它:

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 的参数类型,结果必须是...的结果类型,x。因此

t3 :: (m->n) -> (n->m) -> m->n
t3    x         y       = x.y.x

这就是 GHCi 告诉你的,重命名了类型变量。