[Haskell-cafe] Lazy Evaluation in Monads
Scott Lawrence
bytbox at gmail.com
Tue May 31 22:56:40 CEST 2011
On 05/31/2011 04:48 PM, Artyom Kazak wrote:
>
> Oh, sorry. I was unclear. I have meant "assuming IO is lazy", as Yves
> wrote.
Ah, ok. That makes more sense.
>
> And saying "some hacks" I meant unsafeInterleaveIO, which lies beneath
> the laziness of, for example, getContents.
Which explains why assuming getContents is strict has never worked for me.
I'm trying to implement unfoldM1 without using unsafeIO, if possible. Since
unfoldM1 f l = do
next <- f l
rest <- unfoldM1 f (next : l)
return (next : rest)
obviously won't work, I've been trying to use fmap
unfoldM1 :: (Functor m, Monad m) => ([a] -> m a) -> [a] -> m [a]
unfoldM1 f l = do
next <- f l
fmap (next :) $ unfoldM1 f (next : l)
Evaluation here also doesn't terminate (or, (head $ unfoldM (return .
head)) doesn't), although I can't figure out why. fmap shouldn't need to
fully evaluate a list to prepend an element, right?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 900 bytes
Desc: OpenPGP digital signature
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110531/88373b39/attachment.pgp>
More information about the Haskell-Cafe
mailing list