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