有人能给我解释一下,为什么做这些功能 已 不同数量的参数和行为, 但 的 同一类型的签名, 但他们都是正确的吗?

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, ,这是组成的两个功能 gf: (g.f) x 等于 g (f x), 即 g 传递的结果 f x.没有参数 x 存在 comp1 因为它隐含地传递给功能。(你可能会觉得 comp1 作为一个 部分适用咖喱 功能,如果它使你感觉更好。)

comp2's型要求两种功能,一个来自 (a->b) 和另一个 (b->c), 以及一个参数的类型 a.没有必要把一个 a -> 在其签名。

两种功能是真的等值;一个简单的使用某些Haskell的技巧,以更简洁。

咖喱. 。在ML和Haskell中的多重拨函数只是返回函数的单词函数的句法糖。它返回的功能需要剩余的参数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top