Current definion of (<|>) for ZipLists:
ZipList xs <|> ZipList ys = ZipList (xs ++ drop (length xs) ys)
doesn't work if the left argument is infinite. It should be:
ZipList [] <|> ys = ys
xs <|> ZipList [] = xs
ZipList (x:xs) <|> ZipList (_:ys) = ZipList (x : (ZipList xs <|> ZipList ys))