Haskell点运算符:它究竟有什么区别?

时间:2014-09-29 19:44:57

标签: haskell functional-programming operators

我对Haskell点运算符的问题感到困惑。我读到的是它基本上创建了一个由另外两个函数组成的新函数。 E.g:

f(g x) = f . g

(省略参数)

然而,如果我也只是忽略了点,会有什么不同?像:

f . g =? f g

因为在两种情况下g都将应用于传递给它的参数,然后f将应用于该结果。

所以我没有看到这两者之间的区别,但是可能存在差异,或者当它更复杂时会有一个区别?但我现在没有看到它,所以如果有人能帮助我,我会非常感激!

祝你好运, Skyfe。

3 个答案:

答案 0 :(得分:7)

表达式

h = f . g

创建一个新函数 h(...),它是 f(g(...))。这可以在不调用f的情况下完成。然而,

h = f g

g传递给f,并将结果分配给h。在这种情况下,在评估f时会调用h

答案 1 :(得分:6)

以下是他们不同的证据:

Prelude> (const . id) True False
True
Prelude> (const id) True False
False

答案 2 :(得分:3)

你只需要小心减少这些定义。

(f . g) x = f (g x)

这是如何定义的;没有其他的。特别是, not f g x根据定义与(f g) x相同。

f (g x) g期望一个参数并产生一个值; f期望一个参数并获得(g x)生成的值;一切都很好。

但如果具有相同的功能,我们会写(f g) x,然后f会收到g - 一个函数 - 作为其参数的值。一些人说,据推测,它预计会有其他的东西。然后它返回的值将被用作函数,并以x作为参数调用!完全不匹配。