论 fmap、fmap fmap、与 fmap fmap fmap
希望标题没有吓到读者……
fmap
长话短说,首先让我们看一下 Haskell 的 Functor 中 fmap
类型信息:
fmap :: Functor f => (a -> b) -> f a -> f b
为简洁起见,文本文字部分的对 Functor 的 typeclass 约束将会省略。
fmap
的作用可以简单理解为将普通函数 (a -> b)
提升到能够作用于 f
所在的世界:(f a -> f b)
。
对于 List
,fmap
与 map
等价;对于 Maybe
,fmap
只将提升后的函数作用在 Just
字段的值上,Nothing
的情况则直接返回 Nothing
……等等这些 fmap
的应用理解起来相当简单。
然而,如果你偶然间遇到了 fmap fmap
甚至 fmap fmap fmap
,你是否能够理解它们的含义?
fmap fmap
若不明其类型信息,何谈了解?让我们先看 fmap fmap
:
Prelude> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b
Prelude> :t fmap fmap
fmap fmap
:: (Functor f1, Functor f) => f (a -> b) -> f (f1 a -> f1 b)
对 fmap
的表述是:将某函数“提升”。在这里,我们要提升的