回覆  hihihi123hk

大概係咁吧 .

    array.reduce( (acc, currValue) => acc + currValue, 0 );

用 FP ...
Augostino 發表於 2017-4-2 20:41


但係FP 其實一樣幾 imperative...

TOP

本帖最後由 hihihi123hk 於 2017-4-2 22:41 編輯

Imperative 思路: Iterate Array 內每個 element, 檢查是否單數,單數的話就改變 Sum,將 Sum 不斷改變,最後成為你期望嘅  Expected output
  1. const arr = [1,5,3,4,5,6]
  2. var sum = 0
  3. for( var i = 0; i < arr.length ; i++){
  4.    if ( arr[i] % 2 === 1) {
  5.       sum += arr[i]
  6.     }
  7. }
  8. console.log(sum)
複製代碼
Declarative 思路: 將 Array 內的 Element 過濾單數,將餘下的 Element 加起
  1. const arr = [1,5,3,4,5,6]
  2. const sum =
  3.   arr
  4.    .filter(x => x % 2 === 1)
  5.    .reduce((sum,e) => sum + e)
複製代碼
Imperative 嘅核心就係 Step by Step 寫出你點做,不斷透過 Mutate, 將某啲 Variable 改到變成 Expected output

Declarative 嘅核心就係描述你做緊嘅野,透過描述 Transformation,最後得出 Expected output (過程中無需要 Mutable variable)

所以解決同一個問題, Declarative 寫出黎嘅野一定比較 Simple 同埋容易 Trace (呢點基本上係公認兼無討論空間), 但未必係最 Efficient。

Imperative 絕對係 Memory efficient,因為電腦都係 Step by Step 咁跟 Instruction 做野,當年 1MB RAM 賣緊 100 USD 嘅時候基本上一定「要」咁做。
面對 Multi-core/ 16GB 100 USD 時代, Imperative 所帶比 Coder 嘅「優勢」只會愈黎愈弱,啲人自然會推 Declarative 黎寫,啲 Code 愈 Simple 愈易 Maintain ( Simple made Easy)。

其實一般 SQL 都一定係 Declarative 寫法   

題外話: 手上公司 Project (Android + iOS) 夾埋接近十萬行 Code, 保守估計使用 while/For-loop/ forEach 次數少過 10 次 (底層為咗 Performance 先用),只係想帶出好多用 Imperative 解決嘅問題其實 Declarative 寫法一樣可以解決到

當然,如果本身隻 Language 特性好難實踐 FP ( 例如 Java <= 7 strictly imperative ),無可能花力氣自己做底層。

TOP

Imperative 思路: Iterate Array 內每個 element, 檢查是否單數,單數的話就改變 Sum,將 Sum 不斷改變, ...
hihihi123hk 發表於 2017-4-2 22:39



    小弟就最唔鍾意用 for-loop, forEach, while 呢 D loop
最鍾意就用隻 function 黎 encapsulate 左佢地

TOP

近年來 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既武功同埋概念, 重新黎過. 欲練神功, 自廢武功也.

TOP

本帖最後由 LoneGumMan 於 2017-4-3 02:20 編輯

再答其他師兄有關 multi-core / multi-thread o既...迷思.

同 multi 唔 multi core 根本乜叉關係都冇.

multi-thread programming 其中最簡單最簡單o既一種問題, 叫 embarrassingly parallel. 每一組 input 同其他input 冇關, 每一個 operation 同之前之後o既 operation 冇關冇 dependency. 而個operation 本身亦唔會影響其他 state, 例如 A+B 之後, A 同 B 既internal state 都唔會變, 例如之前講過 F(a,b) : a+b 一樣.

假設有個問題, 俾兩條 一樣大o既 array 要你每一對同 index o既 element apply 一個 operation, 放個 result 落第三條 array. 個 operation 係 side effect free. 咁如果你有 N 咁多每 arithmetic unit / CPU / whatever, 可以同一時間 apply F 落 1:n element. 你絕對可以一個 cycle 計晒.

正正就係 functional programming 呢樣 side effect free o既特點, 令到 functional program 理論上可以好 parallel. 就係咁簡單.

至於之前有位師兄問ryzen 會唔會用黎做functional programming 好正... 如果你要解決O既問題可以咁玩, 你應該係買張 1080 Ti / Titan X ...快十萬八千倍. On the other hand, functional programming 同用乜野 cpu 根本冇關係...

TOP

回復 25 #LoneGumMan

唔該晒ching

via HKEPC Reader for Android

TOP

本帖最後由 3ldk 於 2017-4-3 08:31 編輯
  1. const arr = [1,5,3,4,5,6]
  2. const sum =
  3.   arr
  4.    .filter(x => x % 2 === 1)
  5.    .reduce((sum,e) => sum + e)
複製代碼
hihihi123hk 發表於 2017-4-2 22:39



根據wiki解釋

Imperative就係你要比指示電腦, 電腦跟你指示去計算結果比你

Declarative就係你話比電腦聽你要乜野, 電腦自動計比你, 聽落根本就係科幻片入面的電腦先識做既事

曾經聽過一句說話, 話電腦其實好白痴, 你唔教佢做野, 佢乜都唔識做

老實講, 我唔係好信唔用loop可以loop到個array, 畢竟幫你計的係電腦, 唔係人腦

所以本來我諗住睇下array既source code, 睇下係咪有咩神奇魔法, 可惜我能力有限, down左v8落黎都搵唔到array係如何implement

跟住我就諗到, 如果叫你用C依種std lib入面乜都無既language, 寫返你依段code出黎的話, 我估計會見到loop, 除非真係有一些可以另人大開眼神的神奇方法...

TOP

學到野

TOP

本帖最後由 hihihi123hk 於 2017-4-3 11:16 編輯
再答其他師兄有關 multi-core / multi-thread o既...迷思.

同 multi 唔 multi core 根本乜叉關係都冇.

mu ...
LoneGumMan 發表於 2017-4-3 02:17


   
FP 最重要概念一年前有開 Post 討論過   呢度好多師兄係完全接受唔到(Immutable, Curring, Monad, Pattern Match..)

呢啲概念一早已經存在,點解不被受重用,呢幾年先愈黎愈多人講?

我自己覺有兩點:
1. 因為十幾廿年前 P3 single thread 係主流
2. 因為時代証明咗 Imperative 真係會 Comparatively Complex

廿年前嘅人就算知識上知道可以點寫 Parallel 行嘅Code,民用嘅 Application 根本連寫都唔會寫

P.S. 唔好係呢度同人講 Scala    

via HKEPC Ionic Reader v1.6.0 - iPhone

TOP

近年來 imperative language 多左functional o既 element, 係因為 functional language 本身己經冇乜突破 ( ...
LoneGumMan 發表於 2017-4-3 01:56



    近來開始寫Java8既Lambda, 學左Lambda個形, 未得其髓, 你篇野我仲未有能力理解到, 先收藏, 幾個月後再攞返出黎睇可能先會明

TOP