There is another possible instance. We can instead write:

    instance Semigroup a => Semigroup (ZipList a) where
      (<>) = liftA2 (<>)
    instance Monoid a => Monoid (ZipList a) where
      mempty = pure mempty

This behaves differently, and it is also law-abiding.

On Thu, May 3, 2018 at 5:22 AM, 박신환 <ndospark320@naver.com> wrote:

As instance Alternative ZipList is defined since 4.11.0.0:

instance Alternative ZipList where
    empty = ZipList []
    ZipList xs <|> ZipList ys = ZipList (xs ++ drop (length xs) ys)

It seems perfectly fine to make Monoid for ZipList as followings:

instance Semigroup a => Semigroup (ZipList a) where
ZipList [] <> ZipList ys = ZipList ys
ZipList xs <> ZipList [] = ZipList xs
ZipList (x:xs) <> ZipList (y:ys) = ZipList (x <> y : ZipList xs <> ZipList ys)

instance Semigroup a => Monoid (ZipList a) where
mempty = ZipList []


Note that this semantic is similar to that of Maybe​.

_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries




--
-Andrew Thaddeus Martin