iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Software Development

Should I use fp-ts系列 第 11

[Should I use fp-ts?] Day 11 - fp-ts: Option match, matchW

  • 分享至 

  • xImage
  •  

在本系列文中,所有的程式碼以及測試都可以在 should-i-use-fp-ts 找到,今日的範例放在 src/day-11 並且有習題和測試可以讓大家練習。

O.match

昨天已經學習到了 getOrElse, getOrElseW,但現在還有一種情況是 onSome 需求不需要原始數值,而是需要其他型別,這時候 O.match 完美符合需求。
首先開始實作 match

type Match = <A, B>(onNone: () => B, onSome: (x: A) => B) => (x: O.Option<A>) => B;
const match: Match = (onNone, onSome) => x => x._tag === 'None' ? onNone() : onSome(x.value);

可以觀察到 matchgetOrElse 非常相似,差別只有數值為 Some 時需要再經過一層 onSome 函數來進行處理。接著使用 match 來改寫昨天的範例。

const imperativeMatch = (xs: ReadonlyArray<number>) => {
  try {
    return `result: ${inverseI(double(headI(xs)))}`; // onSome
  } catch {
    return 'no value'; // onNone
  }
};

// use [1, 2, 3] as an example
const fpMatch = (xs: ReadonlyArray<number>) => pipe( 
  xs, // [1, 2, 3]
  head, // { _tag: 'Some', value: 1 }
  O.map(double), // { _tag: 'Some', value: 2 }
  O.flatMap(inverse), // { _tag: 'Some', value: 0.5 }
  O.match(
    () => 'no value', // onNone
    v => `result: ${v}`, // onSome
  ), // 'result: 0.5'
);

O.matchW

同理,match 也會有 onNone, onSome 想要輸出不同型別的情況,我們接著實作 matchW

type MatchW = <A, B, C>(onNone: () => C, onSome: (x: A) => B) => (x: O.Option<A>) => B | C;
const matchW: MatchW = (onNone, onSome) => x => x._tag === 'None' ? onNone() : onSome(x.value);

一樣以上述的範例改寫。

const imperativeMatchW = (xs: ReadonlyArray<number>) => {
  try {
    return `result: ${inverseI(double(headI(xs)))}`; // onSome
  } catch {
    return false; // onNone
  }
};
// use [0, 2, 3] as an example
const fpMatchW = (xs: ReadonlyArray<number>) => pipe( 
  xs, // [0, 2, 3]
  head, // { _tag: 'None' }
  O.map(double), // { _tag: 'None' }
  O.flatMap(inverse), // { _tag: 'None' }
  O.matchW(
    () => false, // onNone
    v => `result: ${v}`, // onSome
  ), // false
);

今天的主題在 should-i-use-fp-ts src/day-11 有習題和測試可以練習,大家可以嘗試自己能不能寫出自己的 matchmatchW

Reference

Option.ts | fp-ts


上一篇
[Should I use fp-ts?] Day 10 - fp-ts: Option getOrElse, getOrElseW
下一篇
[Should I use fp-ts?] Day 12 - fp-ts: Option alt
系列文
Should I use fp-ts25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言