近年來 imperative language 多左functional o既 element, 係因為 functional language 本身己經冇乜突破 (c# 果D async 野係另一個發展方向), 所以向其他 paradigm 借鏡. Functional language 一直都存在. 講遠少少, 響 imperative o既世界, C++ 你 overload 左個 operator() 咪有個 functor 囉, 差不多function as first class object (當然唔係呢一回事) STL 裏面都已經有 functional o既 element, 同C++ 打孖上o既 boost 更加有 Spirit 一套比較完整O既系統. 廿年前講大學學Mathematica (果陣都己經有左好耐) 都係 functional
我覺得呢度好多師兄都好似捉錯用神, 好似有lambda 就係 functional programming. 諗清楚, 一樓果個post 自己都講左其實將 onClick 個handler 轉左做 lambda, 有乜咁特別? 只不過係慳左打字, 實情個 compiler 老老實實係會幫你 translate 做一個 anonymous inner class (class 名係 outer$function$interface 咁一路砌落去, 你step through debug / throw exception 就會見到). 十年前要打四行字八個括孤new class overload 一個 function o既野, 個 compiler 幫你 auto gen 個殼出黎咁解. 其他 function reference 果D 基本上都係syntatic sugar. 換句話講, 十年前根本就做到而家好似好新o既 lambda 一模一樣O既野, 只不過打多啲字. (over simplify 左少少, 仲有其他tooling/debug support, 但係真係離事實唔遠)
講 imperative vs. declarative o既師兄, 都未中紅心. Prolog 都係 declarative, 但係冇人會話prolog 係 functional language. Functional programming 最最最 重心 係 "Function", 指O既係數學上o既 function 呢一個概念. Function 做o既野係將一個 input domain map 去另一個 domain , that's it. F(a,b) : a+b, 將 A , B 呢兩樣野 apply 一個 operation, 變左第二個 domain o既數值, 冇side effect (即係唔會影響到第三個 variable C). 好似樓上o既 "sum" 咁. 當隻 language 對 "F(x,y)" 呢舊野有認知, 而唔係 BiFunction<X,Y,Z> 咁樣野syntatic sugar, 咁佢就做到 function as first class citizen 喇. java 而家係扮到.
functional language 另一樣特色, 係 pattern matching. 當你可似叫個 language "唔該幫我 apply 呢個 function 落所有match 到某一pattern o既東西度 (有啲似 collecton.filter(...).reduce(...) ), 咁你就真似連 loop 都唔駛寫喇...
如果真係想知道乜野係 functional programming , 一定一定一定要跳出 java / c# 呢幾種language (其實 javascript 都幾 functional). .net o既可以睇下 F#, java 就用 scala...不過我個人建議重頭 學 haskell /Ocaml..咁樣先可以迫自己廢左之前o既武功同埋概念, 重新黎過. 欲練神功, 自廢武功也. |