log-book

Functors, Applicative Functors and Monads (and Maybe)

November 23, 2022, tags: monad, haskell.

Conclusion

  1. functor 是实现 Functor typeclass 的数据类型
  2. applicative 是实现 Applicative typeclass 的数据类型
  3. monad 是实现 Monad typeclass 的数据类型
  4. Maybe 实现了所有它们三个,因此同时是 functor、applicative,和 monad

图解 Functor、Applicative、Monad, Aditya Bhargava.

Functors

  1. 可以被 map over 的对象,是一个 typeclass。
fmap :: (a -> b) -> f a -> f b

fmap是这个 typeclass (Functor 类) 中唯一被定义的函数。我们可以把fmap当做某种 lifting function,接受一个参数为普通值 a -> b 的函数并把它提升为一个参数为容器 f a -> f b 的函数 (接受 function 并回传一个新的 function 的 function,回传的 function 接受一个 functor 并回传一个 functor)。

ghci> :t fmap (*2)
fmap (*2) :: (Num a, Functor f) => f a -> f a
ghci> :t fmap (replicate 3)
fmap (replicate 3) :: (Functor f) => f a -> f [a]
  1. 中缀符为 <$>

Functor Laws

  1. preserve identity: fmap id = id
  2. composable: fmap f . fmap g = fmap (f . g) (把两个 fmap 组合使用效果应该和把函数组合起来再用 fmap 相同)

Functor 的定义所带来的限制

  1. 如果一个类型有且仅有一个类型参数,我们才能给它 实现 Functor 实例。 因此,我们不能给 Either a b 或者 (a, b)fmap 实现,因为它们有两个类型参数。我们也不能 给 Bool 或者 Int 写,因为它们没有类型参数。
  2. 我们不能给类型定义添加任何约束。

Applicative

Monads

Maybe