在本系列文中,所有的程式碼以及測試都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-03
。
本系列文的目的是讓讀者 和筆者 能夠順利使用 fp-ts
函式庫並納入自己的專案中,在這之前我們先簡單的說明一下 functional programming 之中最基礎的概念。
一個 function 要被稱為 pure function,會需要滿足以下條件(節自 wikipedia):
1. the function return values are identical for identical arguments (no variation with local static variables, non-local variables, mutable reference arguments or input streams).
2. the function has no side effects (no mutation of local static variables, non-local variables, mutable reference arguments or input/output streams).
用簡單的話語總結的話是:
簡單舉個例子:impureInc1
是 impure function,雖然滿足 one input, one output,但使用了 IO (console
)
const impureInc1 = (num: number) => {
console.log(num);
return num + 1;
}
impureInc1(0); // console.log(0), return 1;
impureInc2
是 impure function,有改動外部變數(num) 的 side effect。
let num = 0;
const impureInc2 = () => ++num;
console.log(num) // => 0;
impureInc2(); // return 1;
console.log(num) // => 1;
pureAdd
則是 pure function,只要給予相同輸入,就必定會返回相同輸出。
const pureInc = (num: number) => num + 1;
pureInc(0); // return 1;
pureInc(0); // return 1;
pureInc(0); // return 1;
說明 pure function 以及 impure function 的目的不是完全不寫不純的函式,而是確保我們確實掌握了哪些部分是 pure
or impure
。
以測試來說 pure
的部分我們可以迅速寫好單元測試來確認正確率,而 impure
寫測試的時候可能就會需要以 Mock
的形式來處理,我們可以依靠這個分類來逐漸掌控系統的哪些部分會是比較高機率出現 Bug,哪些部分的資料常常會被操作(mutate)。