On 9/21/07, Iavor Diatchki <iavor.diatchki@gmail.com> wrote:
Hi,
On 9/18/07, Benjamin Franksen <benjamin.franksen@bessy.de> wrote:
Ashley Yakeley wrote:
Monoid ought to be a type, in my view. And each of those wrapper classes can be replaced by a value in that type.
Would you care to elaborate this idea? Do you mean a record with two functions?
Here is how you can do that:
data Monoid a = Monoid { mempty :: a, mappend :: a -> a -> a }
Alternatively, class Monoid a where type Carrier a mempty :: a -> Carrier a mappend :: a -> Carrier a -> Carrier a -> Carrier a data Sum a instance Num a => Monoid (Sum a) where type Carrier (Sum a) = a mempty _ = 0 mappend _ = (+) data Lift f a instance (Monoid a, Applicative f) => Monoid (Lift f a) where type Carrier (Lift f a) = f (Carrier a) mempty _ = pure (mempty (undefined::a)) mappend _ = liftA2 (mappend (undefined::a)) data Writer o a = Writer (Carrier o) a instance (Monoid o) => Monad (Writer o) where return a = Writer (mempty (undefined::o)) a (Writer o1 a) >>= f = let Writer o2 b = f a in Writer (mappend (undefined::o) o1 o2) b -- Dave Menendez <dave@zednenem.com> <http://www.eyrie.org/~zednenem/>