
On Sun, 26 Jul 2015, Oleg Grenrus wrote:
On 26 Jul 2015, at 06:43, M Farkas-Dyck
wrote: On 26/07/2015 at 12:23:13 +0900, Fumiaki Kinoshita wrote:
There is another possible instance:
instance Semigroup a => Monoid (ZipList a) where mempty = ZipList [] mappend (ZipList xs0) (ZipList ys0) = ZipList (mappend xs0 ys0) where go (x:xs) (y:ys) = x <> y : go xs ys go xs [] = xs go [] ys = ys
This breaks the identity law.
I don't see, how it breaks the identity law. :-(
instance Monoid a a => Monoid (ZipList a) where mempty = ZipList (repeat mempty) mappend (ZipList xs) (ZipList ys) = ZipList (zipWith (<>) xs ys)
This was the original proposal, isn't it? Since there does not seem to be a real application for the instance there is no way to choose a particular one. But then it is better to omit the instance, at all. Not having an instance can be a good thing in terms of (type) safety.