[Haskell-beginners] Re: folds again -- myCycle
Will Ness
will_n48 at yahoo.com
Sun Mar 15 14:35:43 EDT 2009
Daniel Fischer <daniel.is.fischer <at> web.de> writes:
>
> Am Samstag, 14. März 2009 08:57 schrieb 7stud:
> > I spent a long time working on a solution for an exercise in RWH: if you
> > can, use foldr to mimic haskell's cycle function. At first, I wondered
>
> So variant 1 amounts to
> myCycle xs = let ys = xs ++ ys in ys
i.e.
myCycle xs = ys where ys = xs ++ ys
or
myCycle xs = xs ++ myCycle xs
- "right recursion" - good (kind of) even under strict semantics - will
actually construct an infinite list in memory (although useless under strict,
since it'll never stop).
> and variant 2 to
> myCycle2 xs = let ys = ys ++ xs in ys
i.e.
myCycle2 xs = ys where ys = ys ++ xs
or
myCycle2 xs = myCycle2 xs ++ xs
- "left recursion" - does nothing under both strict and non-strict semantics -
just goes into infinite loop trying to figure out what to do but never gets to
do anything really.
> We have, for all lists ks, ms:
> ks ++ ms = foldr (:) ms ks
which then by direct application yields
-- myCycle xs = xs ++ myCycle xs
myCycle xs = foldr (:) (myCycle xs) xs
>
> So we can write variant 1 as the snappy
>
> myCycle xs = let ys = foldr (:) ys xs in ys
which is then just rewritable as:
myCycle xs = ys where ys = foldr (:) ys xs
or (arriving at the same result)
myCycle xs = foldr (:) (myCycle xs) xs
I find that "where" rewrites are easier to comprehend for me, more often than
not. :)
Cheers,
More information about the Beginners
mailing list