I rather like this version. It avoids needlessly holding onto the entire list from the start, unlike the original version, which is leakier, and avoids the unnecessary strictness problem of the second version. We should definitely keep the original in a comment as a description of the meaning of the operator, with an explanation of the change, though, as the road here is rather convoluted, and to Andreas' point it is far easier to understand even if it has undesirable garbage collection properties. -Edward On Tue, Jun 5, 2018 at 3:00 AM, Chris Wong <lambda.fairy@gmail.com> wrote:
The proposed definition has one drawback: it is strict in its second argument.
It should be possible to make it lazy in its second argument while keeping the single-pass behavior, though. Something like this?
ZipList xs <|> ZipList ys = ZipList $ go xs ys 0 where go [] ys n = drop n ys go (x:xs) ys n = x : (go xs ys $! n + 1)
On Tue, Jun 5, 2018, 15:36 박신환 <ndospark320@naver.com> wrote:
Current definion of (<|>) for ZipLists:
ZipList <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#ZipList> xs <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#local-6989586621679319881> <|> <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/GHC.Base.html#%3C%7C%3E> ZipList <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#ZipList> ys <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#local-6989586621679319882> = ZipList <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#ZipList> (xs <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#local-6989586621679319881> ++ <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/GHC.Base.html#%2B%2B> drop <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/GHC.List.html#drop> (length <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Data.Foldable.html#length> xs <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#local-6989586621679319881>) ys <http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Applicative.html#local-6989586621679319882>)
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))
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries