iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Software Development

Should I use fp-ts系列 第 22

[Should I use fp-ts?] Day 22 - fp-ts Apply

  • 分享至 

  • xImage
  •  

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

Apply

使用 functional programming 中的 pure function 會有以下幾個特性:

  1. 無副作用
  2. 可 memorize
  3. 可並行處理
    但直到目前為止,我們都尚未使用到"可並行處理這個特性",今天會使用 Apply 來讓 ADT 的判斷有並行的功能,先來看程式碼,這邊的錯誤我們使用 day-18 的範例來進行,這邊比較不同的是所有的錯誤情境都是回傳一個 Array<stirng> 方便我們組合所有的錯誤。
type User = {
  username: string;
  email: string;
  password: string;
};

const validateE = E.getApplicativeValidation(A.getMonoid<string>());
const sequenceValidateE = Ap.sequenceT(validateE);

const moreThan3Chars = E.fromPredicate(
  (xs: string) => xs.length > 3,
  () => ['Need more than 3 chars'],
);
const validateEmail = E.fromPredicate(
  (xs: string) => xs.includes('@'),
  () => ['Invalid email'],
);
const moreThan6Chars = E.fromPredicate(
  (xs: string) => xs.length > 6,
  () => ['Need more than 6 chars'],
);
const hasCapital = E.fromPredicate(
  (xs: string) => /[A-Z]/.test(xs),
  () => ['Need at least one capital letter'],
);
const hasNumber = E.fromPredicate(
  (xs: string) => /\d/.test(xs),
  () => ['Need at least one number'],
);

const validate = ({ username, email, password }: User) => pipe(
  sequenceValidateE(
    moreThan3Chars(username),
    validateEmail(email),
    moreThan6Chars(password),
    hasCapital(password),
    hasNumber(password),
  ),
  E.map(([s]) => s),
);

sequenceValidateE 之中的所有驗證行為,都會是同時進行的,大家可以嘗試使用 Promise.all 來想像,所有的 Either<string[], B> 都會同時輸出驗證結果。

今天的主題在 should-i-use-fp-tssrc/day-22 並且有測試可以讓大家練習。

Reference

Applicative.ts | fp-ts


上一篇
[Should I use fp-ts?] Day 21 - fp-ts Either trycatch 2
下一篇
[Should I use fp-ts?] Day 23 - fp-ts Array
系列文
Should I use fp-ts25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言