Functional programming 什么';这是J引入fork的动机

Functional programming 什么';这是J引入fork的动机,functional-programming,theory,j,apl,Functional Programming,Theory,J,Apl,对于从APL到J的演变,引入fork的动机是什么?我想有(++/%#)来计算平均值是很好的,但这也使得阅读更长的动词序列变得更困难。面对这种权衡,APL发明家是否有任何令人信服的理由在J中选择这种风格?我认为fork有动机将现有功能组合起来形成一个新功能。J中函数的组合用@:或@表示,以从函数f和g创建一个新函数,f@:g。也就是说,取g的结果,用f进行处理 Fork的功能相同,但允许我们使用第三个函数(中心齿)处理两个不同函数(右齿和左齿)的结果。所以(fhg)将f和g的结果应用于中心齿h。f

对于从APL到J的演变,引入fork的动机是什么?我想有
(++/%#)
来计算平均值是很好的,但这也使得阅读更长的动词序列变得更困难。面对这种权衡,APL发明家是否有任何令人信服的理由在J中选择这种风格?

我认为fork有动机将现有功能组合起来形成一个新功能。J中函数的组合用@:或@表示,以从函数f和g创建一个新函数,f@:g。也就是说,取g的结果,用f进行处理


Fork的功能相同,但允许我们使用第三个函数(中心齿)处理两个不同函数(右齿和左齿)的结果。所以(fhg)将f和g的结果应用于中心齿h。fork构造很有趣,因为它是一种通过分组函数而不需要额外符号来生成新函数的方法。正如您所指出的,它是可扩展的,因此(a b c d e)被理解为(a b(c d e)),其中fork c d e的结果被用作正确的齿。

感谢Bob的回答。为了使它更坚固,现在我了解到叉子的必要性如下

  • 引入fork的动机是实现默认编程,以实现。为此,您需要一些基本组合符(如),而hook/fork构成了一个完整的基础。出于这个目的,叉子或其等价物确实是不可避免的

  • 如果想到
    f+g
    f*g
    ,fork的概念是很自然的。在数学中,它们通常指
    f(x)+g(x)
    f(x)*g(x)

  • 这一主题在中得到了很好的解释


您自己的答案很好地概括了这个主题。但是我想补充一下为什么大多数人觉得
(+/%#)
更难阅读{(+/⍵)÷≢⍵}.1.大括号
{}
清楚地标识正在定义一个新函数;这在J的默契风格中一点也不清楚,这使得更大的表达式更难阅读(=用眼睛解析)2.组合现有函数的语法是相同的,无论您是在函数深度0(也称为常规编程)还是更高的位置工作(又称函数式编程):
(+/A)÷≢A
vs.
{(+/⍵)÷≢⍵}等等。3.APL符号更清晰,更容易阅读。我认为你的第二个要点很重要。对我来说,J的火车更像是表达某种东西的高级方式,很像J中的
sum=foldl(+)0
(或
sum=:+//code>)相反,当我看到一个
x+f(x)
x*f(x)
形式的表达式时,我立即想到“嘿,这是一个钩子”,即使在J之外。