【发布时间】:2014-07-15 13:30:32
【问题描述】:
是否有一个包大致执行以下操作:
给定一个记录:
data R = R { a :: TypeA,
b :: TypeB,
c :: TypeC }
导出一个提升的记录:
data R_L f = R_L { a_L :: f TypeA,
b_L :: f TypeB,
c_L :: f TypeC }
并提供几个类似的实例和功能:
instance (Monoid (f TypeA), Monoid (f TypeB), Monoid (f TypeC))
=> (Monoid (R_L f)) where
mempty = R_L mempty mempty mempty
mplus a b = ...fieldwise mplus...
sequenceR :: (Monad m) => R_L m -> m R
sequenceR = ... run fields, sum results ...
sequenceRA :: (Applicative m) => R_L m -> m R
sequenceRA x = R <$> a_L x <*> b_L x <*> c_L x
可能还有其他人。是否有提供此功能的包?如果没有,最好使用哪种机制(TH?泛型?)来实现它?
【问题讨论】:
-
那个幺半群实例没有意义,因为
f有一种* -> *。可以与MonadPlus合作,您是这个意思吗? -
经过编辑使 Monoid 实例更加清晰,但我也欢迎 MonadPlus 实例。