Phantom applicative functors

October 4, 2013
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}

ConstApplicative Programming with EffectAccy,说的就是这种累加效果。