使用 N 取代回傳 Nothing 的 Function
Ramda 有提供 T
及 F
,Sanctuary 有提供 I
,這些都是非常好用 Function,事實上 _ => Nothing
亦經常使用,亦可簡化成 N
。
失くすものさえない今が強くなるチャンスよ
Ramda 有提供 T
及 F
,Sanctuary 有提供 I
,這些都是非常好用 Function,事實上 _ => Nothing
亦經常使用,亦可簡化成 N
。
Sanctuary 雖然有提供 Just
與 Nothing
回傳 Maybe,卻沒有辦法將任何 Value 直接轉成 Maybe,Wink-fp 特別提供 toMaybe
。
setInterval()
為實務上常用 Function,但可惜其並非 Curry Function,不方便 Function Pipeline,interval()
為 setInterval()
的 Curry 化版本。
多 Argument Function 並不適合 Function Pipeline,實務上會透過 apply()
轉成 Unary Function,並透過 list()
準備 Argument。
使用 map()
時若需對值做簡單轉換,直覺會在 Arrow Function 內使用 if else
對應,事實上可以使用 lookup()
以 Point-free 實現。
若要在 String 之後根據指定長度補 0
,Wink-fp 提供了 padEnd()
。
若要在 String 之前根據指定長度補 0
,Wink-fp 提供了 padStart()
。
ECMAScript 提供了 Math.ceil()
對 Number 無條件進入,但此為 Static Method ,因此提供 ceil()
Free Function 方便 Function Pipeline。
ECMAScript 提供了 Math.floor()
對 Number 無條件捨去,但此為 Static Method ,因此提供 floor()
Free Function 方便 Function Pipeline。
ECMAScript 提供了 Math.round()
對 Number 四捨五入,但此為 Static Method ,因此提供 round()
Free Function 方便 Function Pipeline。
ECMAScript 2015 迎來了 Array.prototype.entries()
,可同時回傳 Array 的 Index 與 Element,但其回傳為 Array Iterator,使用上較為不便,可自行組合 entries()
改回傳 Array,方便以 Function Pipline 組合其他 Function 。
除了 arguments
與 NodeList
是 Array-like Object 外,事實上也可以自行以 Object Literal 組成,透過 from()
轉成真正 Array 後,就可 Function Pipeline 使用 Ramda 的 Function。
Ramda 並沒有內建 avg()
,Wink-fp 特別提供 avg()
補足缺憾。
pluck()
可從 Object Functor 取出單一 Property,若要取出多個 Property,則要使用 plucks()
。
discard()
若要也能有 discardWith()
,其中一個方法就是借用 withoutWith()
組合而成。
若有指定 Value 要從 Array 中刪除,可使用 Wink-fp 的 discard()
直接從 Array 中刪除。
without()
與 difference()
目的相同,都是兩個 Array 相減,唯其 Signature 剛好相反,Ramda 有提供 differenceWith()
,但卻沒有 withoutWith()
,但我們可以自行組合。
Ramda 提供了 propEq()
,專門產生比較 Property 是否 相等
的 Predicate,若 不等
呢 ? 理論上可以自己組合出新 Function,Wink-fp 已經提供 propNEq()
可直接使用。
Ramda 有提供 propLte()
,特別適合為 Object 提供 Predicate,但可惜只能用在 equals()
,但若要配合 lte()
時,我們能打造類似 propEq()
的 propLte()
嗎 ?
Ramda 有提供 propEq()
,特別適合為 Object 提供 Predicate,但可惜只能用在 equals()
,但若要配合 lt()
時,我們能打造類似 propEq()
的 propLt()
嗎 ?
Ramda 有提供 propEq()
,特別適合為 Object 提供 Predicate,但可惜只能用在 equals()
,但若要配合 gte()
時,我們能打造類似 propEq()
的 propGte()
嗎 ?
Ramda 有提供 propEq()
,特別適合為 Object 提供 Predicate,但可惜只能用在 equals()
,但若要配合 gt()
時,我們能打造類似 propEq()
的 propGt()
嗎 ?
若要判斷 Property 是否包含指定 String,Ramda 並沒有提供類似 propEq()
那樣直接的 Function,但我們可自行組合出 propIncludes()
。
實務上常需要儲存 Boolean 到 Local Storage,但可惜 Local Storage 只能儲存 String,因此 true
與 false
會儲存成 'true'
與 'false'
,該如何優雅處理呢 ?
Local Storage 雖可透過 Web API 的 localStorage.clear()
刪除,但其並非 Free Function 不適合 Function Pipeline,Wink-fp 特別包成適合 FP 的 clearStorage()
。
Local Storage 雖可透過 Web API 的 localStorage.removeItem()
刪除,但其並非 Free Function 不適合 Function Pipeline,Wink-fp 特別包成適合 FP 的 removeStorage()
。
Local Storage 雖可透過 Web API 的 localStorage.getItem()
讀出,但其並非 Free Function,且若 Key 不存在會回傳 undefined
,這些都不適合 Function Pipeline,Wink-fp 特別包成適合 FP 的 readStorage()
。
Local Storage 雖可透過 Web API 的 localStorage.setItem()
寫入,但其並非 Curried Function 不適合 Function Pipeline,Wink-fp 特別包成適合 FP 的 writeStorage()
。
map()
對於 Array 重要性毋庸置疑,是我們每天必用 Function,Object 是否也能有map()
,讓我們直接提供 Function 對 Object 的 Key 修改,並回傳新 Object ?
map()
對於 Array 重要性毋庸置疑,是我們每天必用 Function,Object 是否也能有map()
,讓我們直接提供 Function 對 Object 的 Value 修改,並回傳新 Object ?
將 String 字首變大寫為常見功能,FP 有其特殊實現方式,由於經常使用,已經收錄在 Wink-fp。
if else
在 Imperative 視為理所當然,但在 FP 卻是中斷 Function Pipeline 殺手,常常 Function 無法組合都是因為 if else
介入,透過 Wink-fp 的 nif()
,可使 Function Pipeline 不中斷。
if else
在 Imperative 視為理所當然,但在 FP 卻是中斷 Function Pipeline 殺手,常常 Function 無法組合都是因為 if else
介入,透過 Wink-fp 的 iif()
,可使 Function Pipeline 不中斷。
Promise Constructor 最常用來配合 setTimeout()
,在 Callback 中以 Closure 取得 resolve()
與 reject()
建立 Promise,事實上當以 sleep()
取代 setTimeout()
後,就可改以 Function Pipeline 取代 Promise Constructor。
Ramda 的 forEach()
其 callback 並沒有包含 Index,雖然可使用 addIndex()
將 forEach()
重新產生新 Function,因為太常使用,已經收錄在 Wink-fp。
Ramda 的 map()
其 callback 並沒有包含 Index,雖然可使用 addIndex()
將 map()
重新產生新 Function,因為太常使用,已經收錄在 Wink-fp。
ECMAScript 2015 的 Template String 非常好用,但若要在 Function Pipeline 使用,則我們需要的是 Curried 版本的 formatN()
。
pipeP()
在 Ramda 0.26.0 已經被列為 deprecated
以 pipeWith()
取代,若我們還想使用 pipeP()
,可自行使用 pipeWith()
組合。
reject()
是 Promise.reject()
的 Free Function 版本,特別適合 Function Pipeline。
實務上我們可能累積了很多 Synchronous Function,但現在想轉成 Asynchronous Function 改回傳 Promise,這種常見的需求該如何實現呢 ?