對於從APL到J的進化,引入叉的動機是什麼?我猜想用(+/ % #)
來計算平均值是很不錯的,但是它也使得閱讀更長的動詞訓練變得更加困難。面對這種折衷,APL發明人是否有任何令人信服的理由在J中選擇這種風格?J引入叉的動機是什麼
回答
感謝鮑勃的回答。爲了使其更強大,現在我瞭解到叉子的必要性如下。
引入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中很好地解釋了此主題。
我認爲你的第二個子彈是重要的。對我來說J的列車感覺像是一種更高層次的表達方式,很像'sum = foldl(+)0'(或J中的'sum =:+ /')與添加到計數器的手動循環。相反,當我看到'x + f(x)'或'x * f(x)'形式的表達式時,我立即認爲「嘿,這是一個鉤子」,甚至在J之外。 – FireFly
我想叉有動力組合現有的功能,形成一個新的功能。 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的結果被用作右齒。
- 1. JFrame中的J是什麼?
- 2. CORS - 引入預檢請求背後的動機是什麼?
- 3. J叉評價
- 4. 表達式的結果和解析結果是什麼j + = j- = j * j和j + = j * = j- = j? (倍數等於)
- 5. 爲什麼「decltype(i + j)」的結果不是右值引用?
- 6. m [i] [j] = Double.parseDouble(in.nextLine())是做什麼的?
- 7. C++:int * j有什麼問題; * J = 50; ?
- 8. j + = j ++在Java中做什麼?
- 9. 什麼是叉返回?
- 10. zip -j命令,-j選項是什麼意思?
- 11. 二維數組,*(pointerArray [i] + j)是什麼?
- 12. 什麼是..和*意味着方面j
- 13. 我(排)和j(排)是什麼意思?
- 14. 什麼是通用有限自動機的一些引擎?
- 15. 合併引入的提交是什麼?
- 16. 交叉驗證的目的是什麼?
- 17. 「\ u001B [J」代表什麼?
- 18. 交叉加入有什麼用途?
- 19. 這個插入排序算法中的「j- = 1」是做什麼的?
- 20. 如果有什麼(j!=「」爲i中的j):意思?
- 21. 什麼是後綴自動機?
- 22. 什麼是自動引用計數?
- 23. 什麼是.j文件?以及如何從.j文件獲取.java文件?
- 24. 什麼是遍歷二叉樹
- 25. 什麼是管道和叉子在C++
- 26. 在GitHub上分叉是什麼意思?
- 27. Java的爲什麼對使用I,J
- 28. 構成J動詞數組參數的「兼容形狀」是什麼?
- 29. arr1 [i ++] = arr2 [j ++]背後的邏輯是什麼?
- 30. 什麼是(Node)nodes.get(j))在Graph文件中的含義?
你自己的回答很好地總結了這個話題。但我想補充爲什麼恕我直言,大多數人發現'(+ /%#)'比'{(+ /⍵)÷}更難讀'。 1.大括號「{}」清楚地表明正在定義一個新函數;這在J的默認風格中並不完全清楚,它使較大的表達式更難閱讀(=一眼就解析)2.無論您是在功能深度0(也就是常規編程)下工作,還是使用現有函數的語法都是相同的,或者更高(又名函數式編程):'(+/A)÷≢A'與'{(+ /⍵)÷≢⍵}'等等。 3.APL符號更加清晰,這使得它們更易於閱讀。 – Tobia