Chain 為常見的 Algebraic Data Type,也是 Monad 必須實現的 Typeclass。
Version
Fantasy Land 5.0.0
Overview
Chain 是能使用 chain
的 type,號稱 Chainable,白話就是能使用 chain
的 type。
Fantasy Land
Chain 基於 Functor 與 Apply,也就是 Functor 與 Apply 所有特性 Chain 皆具備。
Chain
fantasy-land/chain :: Chain m => m a ~> (a -> m b) -> m b
Chain 必須包含chain
,可將 Chain 與回傳 Chain 的 function 綁定並回傳新 Chain
- 根據 Fantasy Land 定義,支援
chain
的 Object 就是 Chain,這也是為什麼 Sanctuary 對於chain
的 type signature 會出現Chain
原因 - Chain 還必須支援 Functor 與 Apply
chain
使我們能將 Chain 與回傳 Chain 的 function 綁定並回傳新 Chain
Chain.test
Primitive
import { Chain } from 'sanctuary-type-classes'
Chain.test (1) // ?
Chain.test ('') // ?
Chain.test (true) // ?
Chain.test ({}) // ?
Chain.test ([]) // ?
Chain.test (() => {}) // ?
Sanctuary 提供了 Chain.test
可判斷 value 是否為 Chain。
- Number、String 與 Boolean 皆非 Chain
- Object 不是 Chain
- Array 與 Function 皆為 Chain
ADT
import { Just, Right, Pair } from 'sanctuary'
import { resolve } from 'fluture'
import { Chain } from 'sanctuary-type-classes'
Chain.test (Pair (1) (2)) // ?
Chain.test (Just (1)) // ?
Chain.test (Right (1)) // ?
Chain.test (resolve (1)) // ?
- Pair 並非 Chain
- Maybe、Either 與 Future 皆為 Chain
Conclusion
- Monad 必須實現 Functor、Apply、Applicative 與 Chain,其中學習 Chain 是必經過程
- 若不確定 value 是不是 Applicative,可使用
Chain.test
判斷