我一直在读一些 Haskell 书籍,他们总是说“这个函数将应用于这个参数”,但我忽略了这一点,因为我认为认为该参数将被应用更直观到函数,也许作者只是用一种有趣的方式来表达自己,但他们我得到了这个错误,现在我不能再忽略它了:
<interactive>:y:x: error:
•No instance for (Show (Integer -> Integer))
arising from a use of ‘print’
(maybe you haven't applied a function to enough arguments?)
•In a stmt of an interactive GHCi command: print it
并且它准确地指出“也许您还没有将函数应用于足够的参数?”,所以在我看来该函数应用于参数而不是相反。所以我的问题是:
例如,如果我有一个像
add
这样的函数,有人说 2
将应用于 add
,然后 3 将应用于其输出,我想是这样的:
add 2
(add 2) 3
但是如果有人对我说
add
将应用于 2 并且其输出将应用于 3,我想是这样的:
2 add
3 (2 add)
有人可以解释一下这个“函数应用于参数”是如何工作的吗?
对我来说,“将函数应用于参数”一直是我描述它的方式,这对于“apply”一词的普通英语含义来说是最自然的。 GHC 显然和我一样使用这个词,我相信这是更常见的用法。
当我谈论将一件事应用到另一件事时,我应用的事物是更“活跃”的参与者。例如,我可能会用锤子敲钉子,或者加热平底锅,或者在皮肤上涂抹防晒霜。在每一种情况下,我都认为锤子、热量、防晒霜等是“导致”所产生变化的因素,而钉子、平底锅、皮肤等则被认为是被动地“作用于”所发生的事物。应用于他们。如果有人告诉我他们把钉子钉在锤子上,我会认为他们真的把钉子钉在锤子上(可能使用另一把锤子!)。
所以当我谈论编程时,我会以类似的方式思考“应用”这个词。如果我有一个函数
f = (+1)
,并且我写 f 10
,我认为 10
只是被动地 being 一个数字;它是惰性的、被动的。我认为 f
是“做某事”的东西;它会等待,直到收到一个参数,然后计算出对其加一的结果是什么。所以我说我将 f
应用于 10
;对我来说,说我将 10
应用于 f
似乎不太自然。 f
是锤子,10
是钉子。此外,我们已经将 pass (如“将参数传递给函数”)作为明确的动词,其中直接宾语是参数,间接宾语是函数,因此将“apply”保存为更方便反过来也行。
然而,这最终是任意的。这只是一个约定。我经常看到人们谈论“将参数应用于函数”,所以显然并不是每个人都像我一样认为它与“apply”一词的普通英语用法自然一致。这是完全可以理解的,您可能已经从以与我相反的方式使用它的来源学到了“编程说话”。如果您发现这种方式更自然,那么没有什么可以阻止您使用它。你只需要面对这样一个事实:其他人有时会以与你不同的方式使用它,并从上下文中找出他们的含义。 因此,实际上没有任何东西可以解释“它是如何工作的”,你只需记住它的运行方式即可。这纯粹是我们如何谈论事物的
英语语言问题,与幕后的任何实施问题无关。 从理想主义的意义上来说,我认为
应该以一种方式一致使用(并且显然我的方式是正确的方式😉),因为函数也是值,可以作为参数传递给其他函数。因此,如果我们只是说“应用”可以按照每个作者的喜好以任何方式表示,那么在某些情况下“应用f
到
g
”是不明确的(与“应用f
到10
”不同,是作者的意思不太可能是 10 f
),这意味着我们必须更冗长才能清楚,说“将函数 f
应用于参数 g
”这样的事情,我们必须同意。因此,虽然我通常赞成描述性语言学而不是规定性语言学,但在这里选择一种正确的方法是“有用的”,而且我认为有足够的理由这样做。更喜欢“将函数应用于参数”,就像 GHC 所做的那样。但现实是它是双向使用的,我只需要忍受偶尔看到相反使用方式的心理摩擦。您还必须接受 GHC,使用与您不同的“应用”一词。