iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Software Development

Should I use fp-ts系列 第 3

[Should I use fp-ts?] Day 03 - pure function

  • 分享至 

  • xImage
  •  

在本系列文中,所有的程式碼以及測試都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-03
本系列文的目的是讓讀者 和筆者 能夠順利使用 fp-ts 函式庫並納入自己的專案中,在這之前我們先簡單的說明一下 functional programming 之中最基礎的概念。

Pure function

一個 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).

用簡單的話語總結的話是:

  1. 一組輸入對應一組輸出,且和其他的變數毫無關聯 (ex. global variable)。
  2. 這個 function 沒有 side effects,這個函式不會更動到任何的變數、或是存取 IO... 等。

簡單舉個例子:
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, impure?

說明 pure function 以及 impure function 的目的不是完全不寫不純的函式,而是確保我們確實掌握了哪些部分是 pure or impure
以測試來說 pure 的部分我們可以迅速寫好單元測試來確認正確率,而 impure 寫測試的時候可能就會需要以 Mock 的形式來處理,我們可以依靠這個分類來逐漸掌控系統的哪些部分會是比較高機率出現 Bug,哪些部分的資料常常會被操作(mutate)。

Reference

Wikipedia - pure function


上一篇
[Should I use fp-ts?] Day 02 - 測試環境
下一篇
[Should I use fp-ts?] Day 04 - declarative vs. imperative
系列文
Should I use fp-ts25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言