useWith(f, [g, identity]) 與 compose() 等效性
當 Point-free 時,常會化簡成 useWith(f, [g, identity])
這種 pattern,事實上這只是簡單的 compose()
而已。
失くすものさえない今が強くなるチャンスよ
當 Point-free 時,常會化簡成 useWith(f, [g, identity])
這種 pattern,事實上這只是簡單的 compose()
而已。
Point-free 後的 Function 常出現等效重構 Pattern,可再以其他 Function 取代,讓 Codebase 更為精簡。
寫程式免不了要使用 if else
判斷,但 if else
是 Imperative 產物, Ramda 則提供 ifElse()
讓我們在 Function Pipeline 中使用。
map()
+ pick()
是實務上常用組合,可重構成 project()
更為優雅。
converge()
與 useWith()
非常類似,useWith()
是新 Function 的 Arity 與 Array 的 Length 相等;而 converge()
是 Array 中所有 Function 的最大 Arity 決定。
若 Function 的各自 Argument 先經過不同 Function 處理過,最後在傳給 Function 的各自 Argument,則可使用 useWith()
使其 Point-free。
實務上 Query String 以 String 形式呈現,該如何快速轉成 Object 方便使用呢 ?
Imperative 的特徵是不斷使用中繼 Variable 傳來傳去,本文示範如何從 Imperative 重構成 FP,並歸納出重構 SOP。
是否曾經想在 Pipeline 中回傳 null
,表示中斷 Pipeline 呢 ? 透過新的 pipeWith()
則可達成。
若只想將 Array 簡單分組,可不必大費周章使用 reduceBy()
,簡單使用 groupBy()
即可。
若除了要有 reduce()
的 Loop 效果,又想邊 Loop 邊分組,Ramda 提供了 reduceBy()
。
後端通常日期會以 ISO String 回傳給前端,要前端自行根據 Timezone 顯示該時區正確時間,且日期格式又會根據客戶需求調整,這常見需求該如何實現呢 ?
ECMAScript 會使用 []
根據 Index 取得 String 的 Char,但 Operator 對於 Function Composition 並不方便,Ramda 另外提供了 nth()
取代之。
ECMAScript 會使用 []
根據 Index 取得 Array 的 Element,但 Operator 對於 Function Composition 並不方便,Ramda 另外提供了 nth()
取代之。
intersection()
雖可找出兩 array 的 交集
,卻無法提供自訂條件,但 innerJoin()
可以。
若要找出兩個 Array 中共有的 Element 且不重複,Ramda 提供了 intersection()
。
Ramda 有大量 Function 需要 Predicate,若 Data 是 Object Array,則 Predicate 的 Argument 為 Object,若必須針對 Property 比較是否相等,可使用 Ramda 的 propEq()
使 Predicate 也能 Point-free。
propEq
是針對 Object 常用的 Predicate,但若不是 equals
,而是如 gte
、gt
、lte
或 lt
呢 ? 那就得使用 propSatisfies
。
Ramda 與 Crocks 都沒有提供 isNonEmptyString()
,但我們可自行組合。
Ramda 不少 Function 只提供正向判斷,如 isEmpty()
、isNil()
…,若要反向判斷,可自行使用 complement()
組合。
根據 Ramda 的 empty()
判斷是否為 Empty Value。
filter()
是 FP 代表性的 Function,但若想表達的是 請將符合條件的資料不顯示
,當然也可以繼續使用 filter()
搭配 反向邏輯
,語義則變成 請將不符合條件資料顯示
;Ramda 特別提供了 reject()
,讓我們能夠使用 正向邏輯
表示。
Ramda 有些 Function 會回傳 undefined
,如 find()
與 prop()
,此時可使用 defaultTo()
使 Pipeline 繼續。
實務上難免會出現 Runtime Exception,此時可使用 Ramda 的 tryCatch()
產生新的 Function。
欲將兩個 Object 合併成單一 Object,若 Property 重複,則以第一個 Object 為主,可使用 Ramda 的 mergeLeft()
。
欲將兩個 Object 合併成單一 Object,若 Property 重複,則以第二個 Object 為主,可使用 Ramda 的 mergeRight()
。
compose()
是 FP 最重要 Function 之一,其中 Function Composition 就是由這此 Function 展開,實務上都是直接使用 Ramda 的 compose()
,事實上也能自行以 ECMAScript 的 reduceRight()
實現。
pipe()
是 FP 最重要 Function 之一,其中 Function Pipeline 就是由 pipe()
展開,實務上都是直接使用 Ramda 的 pipe()
,事實上也能自行以 ECMAScript 的 reduce()
實現。
若要忽略 Object 部分 Property,Ramda 提供了 omit()
;但若要忽略單一 Property,這就是 dissoc()
。
若 object 存在則 update,不存在就 insert
是實務上常見處理資料方式,Ramda 並沒有如 SQL 提供簡單寫法,但可以自行組合 Function。
有些演算法在 Imperative 需使用 do while
實現,在 Ramda 可改用 until()
。
有不少 Function 的 Arguemtn 要求 Array,如 pick()
、project()
,此時可先使用 of()
先建立 Array 之後再傳給 Function。
objOf()
表面上是提供 Key / Value 產生 Object,但實務上大部分都是利用其 Currying 特性,產生其他 Function 所需的 Callback。
filter()
亦是 FP 常用的 Higher-order Function,事實上我們也可自行實作 filter()
練習 FP 基本功。
通常都是在後端以 SQL 或 ORM 取得排序後第一筆資料,若要在前端實現呢 ?
Ramda 有 all()
並不令人訝異,ECMAScript 也有 every()
,但 Ramda 又另外提供了 allPass()
,這與 all()
有什麼不同呢 ?
Ramda 有 any()
並不令人訝異,ECMAScript 也有 some()
,但 Ramda 又另外提供了 anyPass()
,這與 any()
有什麼不同呢 ?
Function 的 Argument 有兩類,一類是提供給 Function,另一類則是提供給 Callback,若要提供的 Data 為 Callback 的第一個 Argument,則適合使用 compose()
使其 Point-free。
pipe()
與 compose()
為實務上最常用於 Function Composition 的兩 Function,雖然兩者可等價替換,但使用時機還是有些差別,本文特別介紹之。
實務上 API 常常只回傳 ID,前端必須根據 ID 查出所對應的 String 顯示,這常見需求該如何使用 Ramda 實現呢 ?