本帖最後由 hihihi123hk 於 2017-4-3 12:00 編輯
根據wiki解釋

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

Declarative就係你話比電腦 ...
3ldk 發表於 2017-4-3 08:30


   
Higher Level Abstraction,愈 High Level 就隱藏愈多底層 Implementation ,所以我有提過,如果隻 Language 無完善嘅 Functional Support ,真係唔好辛苦自己 Reinvent the wheel

例如用 Java 8, Php 要100% 實踐/學習 FP 只會辛苦自己(係 Java PHP 淨係Implement Immutable Object 已經夠浪費自己時間),揀隻好少少嘅 Language 重新上路比較實際,「實用性」較高嘅個人推介 JVM based 有 Scala, Kotlin, Elixir/Erlang, 無咁好但都比 Java8 好嘅有 Swift

另外值得一題,呢幾年興緊嘅係 ReactiveX,用FP 嗰種想法(Declarative) 解決問題只係一個起點,識得操控 ReactiveX 先叫得上係一把鋒利嘅刀


最多人用緊一定係 RxJava (因為有 Android 加持)

有興趣自行 Google
Netflix Reactive (有兩個 Post 影響深遠)睇下人地點講,第一代 RxJava 係 Netflix open source 出黎(鼻祖係 Rx.Net, C#)

P.S. 識得 FP != 直接識 ReactiveX,ReactiveX 係一種玩 Data flow 嘅全新概念,有 FP 底/ Declarative 思考會有幫助學習

via HKEPC Ionic Reader v1.6.0 - iPhone

TOP

小弟就最唔鍾意用 for-loop, forEach, while 呢 D loop
最鍾意就用隻 function 黎 encapsulate 左佢 ...
snoopy11hk 發表於 2017-4-3 01:01


   
支持 (如果係 Pure function)  

via HKEPC Ionic Reader v1.6.0 - iPhone

TOP

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


   
我再強調先(我係前幾樓已經講過

寫 FP 一定係寫緊 Declarative style

寫 Declarative Style 唔一定係寫緊 FP

而家嘅人學習 FP (我覺得)係為咗學習 Declarative 解決問題嘅思考模式,呢種想法先係最值錢,無足夠時間去試/浸淫係無可能學得識去解決問題。

暫時眼見比較實用嘅 End game 位係操控 ReactiveX

信不信由你   

利申:重度學習咗 ReactiveX 1.5年 ,玩過 RxJs, [RxJava, RxScala, RxKotlin], RxSwift,學之前學過 Scala FP + Java 8 Stream API 約 1年。見到公司啲新人無 FP 底去學 ReactiveX 係完全跟唔到,最後都係由Scala FP 開始重新 Train

via HKEPC Ionic Reader v1.6.0 - iPhone

TOP

我到而家都唔知點寫到用 reactivex 又 side effect free.

如以下 click event -> trigger http request 的 pseudo code
  1. clickEventObservable
  2.   .do( startLoadingIcon )
  3.   .flatmap( makeHttpRequest )    // side effect
  4.   .map( convertResult )
  5.   .do( stopLoadingIcon )
  6.   .subsrcibe( showResultOnScreen );
複製代碼
side effect 應該放晒入 subscribe 入面做,  有時為左方便會用 do (用做 logging) . 但 makeHttpRequest 呢個 ... 佢又係有 side effect , 唔放 chain 中間又唔知點放 ...

TOP

本帖最後由 hihihi123hk 於 2017-4-3 16:40 編輯
我到而家都唔知點寫到用 reactivex 又 side effect free.

如以下 click event -> trigger http request 的 ...
Augostino 發表於 2017-4-3 15:25



正常黎講 makeHttpRequest 應該係 Stateless
正常黎講做 Http Request 應該有一層 API Service layer 全部 return Observable<T>

.do(...) 就係 Design for making side effect,但原則上 .do(...) 入面做嘅唔應該影響到下面 Chain 落去嘅 Function, 即係話如果你段斬咗啲 .do(..) 會出問題嘅話,本身 Data flow 個設計已經有問題

你講個 Case 個 Loading icon 其中一個做法可以用 API Service Layer 產生出黎嘅 Stream 入面加上 doOnSubscribe doOnComplete 去處理

再好啲嘅做法,.do() 入面唔好直接改動 UI,因為 UI changes 一定要係 Main Thread 發生。將 Data flow 同 UI Changes 完全隔離 ,寧願開多一個 Data Stream (PublishSubject) 收 Signal ,再將 Signal 同埋 UI 做一個 One-way binding

概念上大約係咁,再 Refactor 埋去 MVVM 嘅 Pattern 會再靚仔好多
  1. let isLoading : PublishSubject<Bool>

  2. clickEventObservable
  3. .flatmap {  // TODO: refactor this block
  4.          makeHttpRequest(...)  // background thread
  5.          .map( convertResult )
  6.          .doOnSubscribe { isLoading.onNext(true) }
  7.          .doOnComplete { isLoading.onNext(false) }
  8.     }
  9. .observeOn(main thread)
  10. .subsrcibe( showResultOnScreen );

  11. isLoading
  12. .observeOn(main thread)
  13. .subscribe(bool -> showLoadingIcon(bool) )
複製代碼

TOP

回覆 35# hihihi123hk

咁應該點定義一個 function 有無 side effect ? makeHttpRequest 雖然係 return Observable<T> , 唔會即刻改backend 個 state ,  但最終都會改到 backend 個 state , 咁應該當係 side effect function ???

TOP

其實FP既思考模式係咪即係Recursion既思考模式?

TOP

其實FP既思考模式係咪即係Recursion既思考模式?
3ldk 發表於 2017-4-4 16:38


一個Recursion不足以形容FP既思考模式

TOP

回覆  hihihi123hk

咁應該點定義一個 function 有無 side effect ? makeHttpRequest 雖然係 return Obser ...
Augostino 發表於 2017-4-3 21:08


1. 一個function 無global variable參與, 只有input parameter
2. function內改變input parameter不會改變function外的variable (小心pass by reference...要改就自己copy出黎改)
3. function 完結只會得到一個output variable, nothing else

------
簡單黎講...就同寫一個testable 可用於unit testing既function差唔多

TOP

見到公司啲新人無 FP 底去學 ReactiveX 係完全跟唔到,最後都係由Scala FP 開始重新 Train


你請個數學系出身既programmer就應該跟得到....orz

TOP