newtype Const b a = Const {unConst::b}
instance Monoid m => Applicative (Const m) where
pure _ = Const mempty
Const f <*> Const v = Const (f `mappend` v)
instance Functor (Const m) where
fmap _ (Const v) = Const v
单纯的累加用Monoid就可以了,要Const有什么用?
需要累加的是Monoid,但是Applicative的kind必须是* -> *
,所以再加一个类型变量,然后就有了Const了?
Const m
更有用的地方是在用Traversable遍历一个数据结构T a
的时候,累加的是m a
,而不是只数据结构里的a
,这就相当于改变fold的规则。
ghci> getConst $ traverse (Const . Sum) [1..10]
Sum {getSum = 55}
ghci> getConst $ traverse (Const . Product) [1..10]
Product {getProduct = 3628800}
Const
在Applicative Programming with Effect叫Accy
,说的就是这种累加效果。