我对Haskell点运算符的问题感到困惑。我读到的是它基本上创建了一个由另外两个函数组成的新函数。 E.g:
f(g x) = f . g
(省略参数)
然而,如果我也只是忽略了点,会有什么不同?像:
f . g =? f g
因为在两种情况下g都将应用于传递给它的参数,然后f将应用于该结果。
所以我没有看到这两者之间的区别,但是可能存在差异,或者当它更复杂时会有一个区别?但我现在没有看到它,所以如果有人能帮助我,我会非常感激!
祝你好运, Skyfe。
答案 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
作为参数调用!完全不匹配。