题
有人能给我解释一下,为什么做这些功能 已 不同数量的参数和行为, 但 的 同一类型的签名, 但他们都是正确的吗?
comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f
comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)
还有,为什么comp2有
comp2 :: (a -> b) -> (b -> c) -> a -> c
而不是喜欢的东西
comp2 :: a -> (a -> b) -> (b -> c) -> a -> c
?
谢谢你。
解决方案
comp2 f g x = g (f x)
是句法糖
comp2 = \f -> \g -> \x -> g (f x)
相似地
comp1 f g = g.f
是糖
comp1 = \f -> \g -> g.f
定义 .
是:
f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion
因此,如果我们将定义插入 comp1
, ,我们得到:
comp1 = \f -> \g -> \x -> g (f x)
这与Desugared形式完全相同 comp2
, ,很明显,定义是等效的。
其他提示
comp1 f g = g.f
是写在 点免费的 风格(没有参照点,但对 值).当你打电话 comp1
, ,有隐含的第三个参数被通过 g.f
, ,这是组成的两个功能 g
和 f
: (g.f) x
等于 g (f x)
, 即 g
传递的结果 f x
.没有参数 x
存在 comp1
因为它隐含地传递给功能。(你可能会觉得 comp1
作为一个 部分适用 或 咖喱 功能,如果它使你感觉更好。)
comp2
's型要求两种功能,一个来自 (a->b)
和另一个 (b->c)
, 以及一个参数的类型 a
.没有必要把一个 a ->
在其签名。
两种功能是真的等值;一个简单的使用某些Haskell的技巧,以更简洁。
咖喱. 。在ML和Haskell中的多重拨函数只是返回函数的单词函数的句法糖。它返回的功能需要剩余的参数。
不隶属于 StackOverflow