Functor、Applicative 和 Monad x
首先,我們來看一下 Functor typeclass 的定義:
?
| 1 2 | class Functor f where ? ? fmap :: (a -> b) -> f a -> f b |
Functor typeclass fmap (a -> b) f a f b f Functor 注:fmap 函數可類比 Swift 中的 map 方法。
?
Applicative typeclass
同樣的,我們先來看一下 Applicative typeclass 的定義:
?
| 1 2 3 | class Functor f => Applicative f where ? ? pure :: a -> f a ? ? (<*>) :: f (a -> b) -> f a -> f b |
我們注意到,與 Functor typeclass 的定義不同的是,在 Applicative typeclass 的定義中多了一個類約束 Functor f ,表示的意思是數據類型 f 要實現 Applicative typeclass 的前提條件是它必須要實現 Functor typeclass ,也就是說它必須是一個 Functor 。
在 Applicative typeclass 中定義了兩個函數:
- pure a (<*>) :將一個在上下文中的函數 f (a -> b) 應用到一個在上下文中的值 f a ,并返回另一個在上下文中的值 f b 。
同樣的,我們先來看一下 Monad typeclass 的定義:
?
| 1 2 3 4 5 6 7 8 9 10 | class Applicative m => Monad m where ? ? return :: a -> m a ? ? ? (>>=) :: m a -> (a -> m b) -> m b ? ? ? (>>) :: m a -> m b -> m b ? ? x >> y = x >>= \_ -> y ? ? ? fail :: String -> m a ? ? fail msg = error msg |
Monad typeclass return(>>=)(>>) fail (>>) fail Monad typeclass
| 1 2 3 | class Applicative m => Monad m where ? ? return :: a -> m a ? ? (>>=) :: m a -> (a -> m b) -> m b |
怎么樣?現在看上去就好多了吧。跟 Applicative typeclass 的定義一樣,在 Monad typeclass 的定義中也有一個類約束 Applicative m ,表示的意思是一種數據類型 m 要成為 Monad 的前提條件是它必須是 Applicative 。另外,其實 return 函數的功能與 Applicative 中的 pure 函數的功能是一樣的,只不過換了一個名字而已,它們的作用都是將一個值 a 放入上下文中。而 (>>=) 函數的功能則是應用一個(接收一個普通值 a 但是返回一個在上下文中的值 m b 的)函數 (a -> m b) 到一個上下文中的值 m a ,并返回另一個在相同上下文中的值 m b 。
?
總結
以上是生活随笔為你收集整理的Functor、Applicative 和 Monad x的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018-2019-1 20165324
- 下一篇: 安装php-swoole的扩展