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.