这个haskell双功能组合的类型是什么?

Min*_*max 0 haskell lambda-calculus currying function-composition curry

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

GHCI告诉我这个:

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

我无法理解这种类型的签名是如何形成的.到目前为止,我已经认为r-most-x基本上是一个函数,它接受a b2并返回a b1,那么这b1是中间函数的输入y,并b2再次输出?它不应该返回新类型的值b3或什么?

lef*_*out 5

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

t2 :: (b1->b2) -> (b2->b1) -> p -> b1 -> b2
t2    x           y           z  = x . y . x
Run Code Online (Sandbox Code Playgroud)

z :: p 根本没有使用,所以我们可以通过改为考虑来轻松消除这种情况

t3 :: (b1->b2) -> (b2->b1) -> b1 -> b2
t3    x           y         = x . y . x
Run Code Online (Sandbox Code Playgroud)

为什么这种类型?好吧,组合链将结果x输入y,并将结果y反馈到x.换句话说,y让你从结果类型x回到参数类型x.因此类型y必须是"倒"型x.所以

t3 :: (m->n) -> (n->m) -> ?
t3    x         y       = x . y . x
Run Code Online (Sandbox Code Playgroud)

组合的类型由"外端"支配,即参数必须是参数的类型,x结果必须是...的结果类型x.于是

t3 :: (m->n) -> (n->m) -> m->n
t3    x         y       = x.y.x
Run Code Online (Sandbox Code Playgroud)

这是GHCi告诉你的,重命名的类型变量.