我有这种类型:
newtype Mem s a = Mem { runMem :: s -> (a,s) }
我必须为这种类型创建一个monoid实例,但为了这样做,我必须使用monoid a的mempty和mappend,无论它是什么。怎么会这样做呢?
instance Monoid a => Monoid (Mem s a) where
mempty = --runMem with the mempty of a
f@(Mem aa) `mappend` g@(Mem aaa) = --runMem with mappend of a
f@(Mem s) `mappend` mempty = f
mempty `mappend` g@(Mem ss) = g
提前致谢
答案 0 :(得分:2)
mempty
只是mempty
的{{1}}和传入的a
。
s
mempty = Mem (\s -> (mempty, s))
可以定义为根据mappend
的结果运行f
,然后g
,然后对结果进行优化:
f