2014-01-23 120 views
6

對於從APL到J的進化,引入叉的動機是什麼?我猜想用(+/ % #)來計算平均值是很不錯的,但是它也使得閱讀更長的動詞訓練變得更加困難。面對這種折衷,APL發明人是否有任何令人信服的理由在J中選擇這種風格?J引入叉的動機是什麼

+2

你自己的回答很好地總結了這個話題。但我想補充爲什麼恕我直言,大多數人發現'(+ /%#)'比'{(+ /⍵)÷}更難讀'。 1.大括號「{}」清楚地表明正在定義一個新函數;這在J的默認風格中並不完全清楚,它使較大的表達式更難閱讀(=一眼就解析)2.無論您是在功能深度0(也就是常規編程)下工作,還是使用現有函數的語法都是相同的,或者更高(又名函數式編程):'(+/A)÷≢A'與'{(+ /⍵)÷≢⍵}'等等。 3.APL符號更加清晰,這使得它們更易於閱讀。 – Tobia

回答

4

感謝鮑勃的回答。爲了使其更強大,現在我瞭解到叉子的必要性如下。

  • 引入fork的動機是實現默認編程作爲Combinatory logic的實現。你需要這種基礎組合器(如s-k basis on wiki),鉤子/叉子形成完整的基礎。爲此目的,叉子或其等同物實際上是不可避免的。

  • 如果想到f + g,f * g,叉的概念是很自然的。在數學中,它們通常意味着f(x) + g(x)f(x) * g(x)

  • Roger Hui's essay on verb trains中很好地解釋了此主題。

+0

我認爲你的第二個子彈是重要的。對我來說J的列車感覺像是一種更高層次的表達方式,很像'sum = foldl(+)0'(或J中的'sum =:+ /')與添加到計數器的手動循環。相反,當我看到'x + f(x)'或'x * f(x)'形式的表達式時,我立即認爲「嘿,這是一個鉤子」,甚至在J之外。 – FireFly

3

我想叉有動力組合現有的功能,形成一個新的功能。 J中函數的組成由@或or來表示,以從函數f和g,f @:g創建一個新函數。這意味着取g的結果並用f處理它們。使用第三個函數(中心尖齒),Fork也是一樣,但允許我們處理兩個不同函數(右和左)的結果。因此(f h g)將f和g的結果應用於中心齒h。 fork構造很有趣,因爲它是通過對函數進行分組而不需要額外符號來生成新函數的一種方法。正如你指出的那樣,它是可擴展的,所以(a b c d e)被看作是(a b(c d e)),其中fork c d e的結果被用作右齒。

相關問題