从其定义之外访问类实例的成员

时间:2017-01-05 17:40:14

标签: haskell typeclass monoids

我有这种类型:

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

提前致谢

1 个答案:

答案 0 :(得分:2)

mempty只是mempty的{​​{1}}和传入的a

s

mempty = Mem (\s -> (mempty, s)) 可以定义为根据mappend的结果运行f,然后g,然后对结果进行优化:

f