函數式-21天入門教程
老是有人問函數式要如何入門。我早就說過了,只要識字的人,函數式就已經入門了 。所以當然-21天就可以入門了。
在原始APL里,求平均數,通常的寫法是
avg←{(+??)÷??}n
而J,求平均數
avg =: +/ % #n
J相對原始APL的一大改進就是我們不再需要使用??
J使用了 [ 和 ] 這兩個函數
x [ y = xnx ] y = yn
這樣用J使用純函數風格組合新函數時,所有用到的都是函數,畢竟 [ ] 是真正普通函數,而??並不是。
這對我們有何啟發呢?我們平時是如何說平均數的
相加 除以 項數n+/ % #n
除了J是從右向左計算的,我們是從左往右計算的,寫法上並沒有本質區別。相對應/,加對應+。 Alan J. Perlis 早就說過了 Though the Chinese should adore APL, its FORTRAN they put their money on。APL你對應不起來還情有可原。J這個都已經完全一樣了,你要是還看不出來,那我不禁要問,你到底識不識字了。
我們用西方不識字的人搞出來的文字理論,當然會覺得有各種省略, 各種倒序,各種詞性亂用。明明很自然的說法,用這狗屁理論解釋不通,那自然是理論有問題。
看看九章算術
合分術曰n母互乘子並以為實n...n
你非要因為母指的是分母,認為這個是名詞。那當然解釋不通了。因為我們的文字從兩千多年前就是函數式的,你得把母當成一個函數,作用是取出分母,那就全都能解釋通了。
用類似ML的風格,近似可以寫成這樣
let 合(x:[分,分]) =n ...n wheren 實 = 並(互(乘)((母 x), (子 x)))n
這就導致了一個問題,你的代碼就沒法朗讀了。
所以說,函數式你早就已經入門了,掌握的還是更高級的形式。而不是Haskell里那種 (.) . (.) 。
推薦閱讀:
※如何理解F#里的 Computation Expressions (Haskell 里的 Monads? )
※愉悅的scheme之旅(2)--用callcc合成控制流
※R語言函數式編程purrr的應用
※Erlang入門教程 - 8. 在終端上輸出
※編程範式與系統設計
TAG:函数式编程 |