點燈坊

失くすものさえない今が強くなるチャンスよ

深入淺出 Apply

Sam Xiao's Avatar 2021-07-22

Apply 為常見的 Algebraic Data Type,也是 Monad 必須實現的 Typeclass。

Version

Fantasy Land 5.0.0

Overview

Apply 是能使用 ap 的 type,號稱 applicable,白話就是能使用 ap 的 type。

Fantasy Land

apply000

Apply 基於 Functor,也就是 Functor 所有特性 Apply 皆具備。

Apply

fantasy-land/ap :: Apply f => f a ~> f (a -> b) -> f b
Apply 必須包含 ap,可將 Apply 與包進 Apply 的 function 綁定並回傳新 Apply

  • 根據 Fantasy Land 定義,支援 ap 的 Object 就是 Apply,這也是為什麼在 Sanctuary 對於 ap 的 type signature 會出現 Apply 原因
  • Apply 還必須支援 Functor
  • ap 使我們能將 Apply 與包進 Apply 的 function 綁定並回傳新 Apply

Apply.test

Primitive

import { Apply } from 'sanctuary-type-classes'

Apply.test (1) // ?
Apply.test ('') // ?
Apply.test (true) // ?

Apply.test ({}) // ?
Apply.test ([]) // ?
Apply.test (() => {}) // ?

Sanctuary 提供了 Apply.test 可判斷 value 是否為 Apply。

  • Number、String 與 Boolean 皆非 Apply
  • Object、Array 與 Function 皆為 Apply

apply001

ADT

import { Just, Right, Pair } from 'sanctuary'
import { resolve } from 'fluture'
import { Apply } from 'sanctuary-type-classes'

Apply.test (Pair (1) (2)) // ?
Apply.test (Just (1)) // ?
Apply.test (Right (1)) // ?
Apply.test (resolve (1)) // ?
  • Pair 並非 Apply
  • Maybe、Either 與 Future 皆為 Apply

apply002

Conclusion

  • Haskell 稱為 Applicative;而 Fantasy Land 稱為 Apply
  • Monad 必須實現 Functor、Apply、Applicative 與 Chain,其中學習 Apply 是必經過程
  • 若不確定 value 是不是 Apply,可使用 Apply.test 判斷

Reference

Fantasy Land, Apply