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
或什么?
首先让我们以一种方式重写它,以便明确哪个参数对应于类型签名的哪一部分:
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告诉你的,重命名的类型变量.