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

时间:2019-01-09 19:31:34

标签: haskell currying lambda-calculus function-composition curry

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

GHCI向我展示了这一点:

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

我不太了解这种类型签名的产生方式。到目前为止,我已经知道最右边的x基本上是一个函数,它接受一个b2并返回一个b1,然后b1是中间函数{{1 }},并再次输出y?它是否不应该返回新类型b2或其他类型的值?

1 个答案:

答案 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告诉您的是带有重命名的类型变量。