[Haskell-cafe] Alternative versus Monoid
Gregory Crosswhite
gcrosswhite at gmail.com
Fri Dec 16 02:38:43 CET 2011
On Dec 16, 2011, at 3:59 AM, Carl Howells wrote:
> Monoid and Alternative are not the same. There is a very important
> difference between them:
>
> class Alternative f where
> (<|>) :: f a -> f a -> f a
> ...
>
> class Monoid a where
> mappend :: a -> a -> a
> ...
>
> The equivalent to Alternative is MonadPlus, not Monoid. The kinds
> matter. In Alternative, you are guaranteed that the type that f is
> applied to cannot affect the semantics of (<|>).
I understand that one needs to worry about kinds in general, but in this particular case such a subtlety is non-issue because you would always be defining Monad for a particular type. That is to say, given an alternative f, the instance of Monoid would be
instance Monoid (f a) where { ... }
where in the above a is an arbitrary type variable.
To give you a more concrete example, the following code compiles and runs, producing the output [1,2,3,4,5,6]
================================================
import Data.Monoid
newtype L a = L [a] deriving (Show,Eq)
instance Monoid (L a) where
mempty = L []
mappend (L x) (L y) = L (x ++ y)
main = putStrLn . show $ (L [1,2,3]) `mappend` (L [4,5,6])
================================================
Cheers,
Greg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20111216/2f028818/attachment-0001.htm>
More information about the Haskell-Cafe
mailing list