使用 array 解開 Array
Maybe 與 Either 都有 maybe
與 either
可解開,事實上 Array 也有 array
可解開 Head 與 Tail,並回傳其他型別。
失くすものさえない今が強くなるチャンスよ
Maybe 與 Either 都有 maybe
與 either
可解開,事實上 Array 也有 array
可解開 Head 與 Tail,並回傳其他型別。
Sanctuary 取得 Object 的 Property 共有兩個 Function:prop
與 get
,其中 prop
與 Ramda 的 prop
相同,唯 Property 若不存在則直接 Runtime Error 而非回傳 undefined
,而 get
則會回傳 Maybe。
若在 map
使用回傳 Future 的 Function,必須要搭配 parallel
才能取出 Array 內的 Future。
Future Either Maybe 為常見的 Monad Stack,如呼叫 API 回傳 Future,再使用回傳 Either 的 Function 判斷 API 回傳值,又使用回傳 Maybe 的 Function 運算,就會出現 Future Either Maybe。
實務上會遇到若 Argument 存在則執行 Side Effect,否則不執行,傳統會使用 if
判斷 Argument,事實上也可透過 Maybe 自動忽略 null
與 undefined
不執行 Side Effect。
map
是 FP 最重要 Function,若以不同觀點來思考 map
就會有不同結果:除了本身的 map
外,還可當成 lift
與 compose
使用。
Monad 內的 Value 稱為 Monadic Value,可用 4 種方法改變之。
當引入 Maybe 後,若 Function 會回傳 Maybe,則適當使用 traverse
或 justs
將使 Function Pipeline 更為順暢。
若先有 Function 回傳 Maybe,再根據 Maybe 內的 Value 呼叫 API,就會出現 Maybe Future。
Future Maybe 為常見的 Monad Stack,如呼叫 API 回傳 Future,再使用回傳 Maybe 的 function 改變 API 回傳值,就會出現 Future Maybe。
實務上 Validation 都會回傳 Either 避免後續 Function 繼續執行,可將多個回傳 Either 的 Function 組合成單一回傳 Either 的 Function。
若想直接從 Array Maybe 中取出 Just 內部 Value 而忽略 Nothing,可直接使用 justs
實現。
當引入 Maybe 後,若使用 map
將 Array 與回傳 Maybe 的 Function 綁定,則會產生 Array Maybe,此時我們很難從 Maybe 取出內部 Value,可使用 traverse
將 Array Maybe 轉成 Maybe Array,如此就很容易從 Maybe 取出 Value。
map
是 FP 最具代表性的 Higher Order Function,僅管大部分 FP 原則都沒搞得很懂,但 map
一定都用得很熟;大部分人都將 map
用在 Array,但因為 First Class Function,map
也能將兩個 Function 綁定。
一般我們所寫的 Function 都只能處理 ECMAScript 的原生 Type,而無法處理 Maybe、Either、Future 這類 Monadic Type,透過 map
可將普通 Unary Function 提升成能處理 Functor 的 Function。
支援 chain
的 Object 稱為 Chain,可使用 chain
將 Chain 與回傳 Chain 的 Function 綁定改變 Chain。
ap
才是正統 S Combinator,但 chain
的 Type Signature 與 ap
非常類似,姑且稱之為 S’ Combinator。
Binary Function 若第二個 Argument 須先經過其他 Unary Function 運算再傳入,此為 S Combinator,可使用 ap
實現。
若想將 API 回傳 Object 的 Property 寫入多個 State,可使用 ap
平行寫入。
若想將 API 回傳 Value 寫入多個 State,可使用 ap
平行寫入。
ap
除了用來將 Apply 與包進 Apply 的 Function 綁定外,也常用來平行執行 Side Effect。
支援 ap
的 Object 稱為 Apply,若想傳入 Function 改變其內部值,可將 Function 包進 Apply 再透過 ap
傳入。
由於 Fluture 遵循 Fantasy Land 規格,因此也可搭配 Sanctuary 使用,但由於 Sanctuary 不認識 Future,因此 Type Checking 會失敗,Fluture 已經提供 fluture-sanctuary-types
,可使 Sanctuary 認識 Future。
一般我們所寫的 Function 都只能處理 ECMAScript 的原生 Type,而無法處理 Maybe、Either、Future 這類 Monadic Type,透過 lift2
可將普通 Binary Function 提升成能處理 Apply 的 Function。
zip
只能制式的將兩個 Array 合併成 Array Pair,若想將兩個 Array 合併成其他形式則要使用 zipWith
。
型別檢查是 Sanctuary 的一大特色,但有些時候型別檢查反而會造成使用上不便,可視需求暫時不使用型別檢查。
zip
為 FP 代表性 Function,可直接將兩個 Array 合併成 Array Pair。
實務上資料常以 String 提供,只要以 Space 作間隔,就能使用 words
轉成 Array。
若出現 Nested Chain,可使用 join
從內層攤平一層 Chain。
當有 Function 回傳 Either,而後續的 Function 都在 Either 內執行時,卻又有 Function 回傳 Future,這就造成 Either 內有 Future 窘境,實務上該如何處理這種兩層 Monad 呢 ?
當有 Function 回傳 Maybe,而後續的 Function 都在 Maybe 內執行時,卻又有 Function 回傳 Future,這就造成 Maybe 內有 Future 窘境,實務上該如何處理這種兩層 Monad 呢 ?
當有 Function 回傳 Either,而後續的 Function 都在 Either 內執行時,卻又有 Function 回傳 Promise,這就造成 Either 內有 Promise 窘境,實務上該如何處理這種兩層 Monad 呢 ?
當有 Function 回傳 Maybe,而後續的 Function 都在 Maybe 內執行時,卻又有 Function 回傳 Promise,這就造成 Maybe 內有 Promise 的窘境,實務上該如何處理這種兩層 Monad 呢 ?
實務上在檢查時一定會同時檢查多個條件,此時必須使用 chain
搭配 Either。
針對 User 輸入做 Validation 時,若有任何錯誤則不再繼續執行,這種 Control Flow 正適合 Either。
由於 Vue 3 支援 Composition API,不只 Function Pipeline 與 Point-free 得以實現,如 FP 慣用的 Maybe 在 Vue 3 裡也得以發揮。
由於 Vue 3 支援 Composition API,不只 Function Pipeline 與 Point-free 得以實現,如 FP 慣用的 Either 在 Vue 3 也得以發揮。
Sanctury 與 Ramda 最大的差別是 Ramda 有些 Function 會回傳 undefined
,這導致有些 Function 一不小心會造成 Runtime Error,但 Sanctuary 一律回傳 Maybe,讓我們不用處理 undefined
也不會出錯。
當 Runtime 出現錯誤且希望執行隨時中斷時,Imperative 會使用 Exception,但 Function Pipeline 並不支援 Exception,需使用 Either 取代。
Sanctuary 的 Maybe 除了提供 fromMaybe
取得 Maybe 內部值外,還另外提供了 fromMaybe_
接受 Thunk,實務上該如何使用呢 ?