On Fri, Sep 19, 2008 at 2:51 AM, <[EMAIL PROTECTED]> wrote: > > Lennart Augustsson wrote > >> main = do >> name:_ <- getArgs >> file <- readFile name >> print $ length $ lines file > > Given the stance against top-level mutable variables, I have not > expected to see this Lazy IO code. After all, what could be more against > the spirit of Haskell than a `pure' function with observable side > effects. With Lazy IO, one indeed has to choose between correctness > and performance. The appearance of such code is especially strange > after the evidence of deadlocks with Lazy IO, presented on this list > less than a month ago. Let alone unpredictable resource usage and > reliance on finalizers to close files (forgetting that GHC does not > guarantee that finalizers will be run at all). > > Is there an alternative? > > -- Counting the lines in a file > import IterateeM > > count_nl = liftI $ IE_cont (step 0) > where > step acc (Chunk str) = liftI $ IE_cont (step $! acc + count str) > step acc stream = liftI $ IE_done acc stream > count  = 0 > count ('\n':str) = succ $! count str > count (_:str) = count str > > main = do > name:_ <- getArgs > IE_done counter _ <- unIM $ enum_file name >. enum_eof ==<< count_nl > print counter > > > The function count_nl could have been in the library, but I'm a > minimalist. It is written in a declarative rather than imperative > style, and one easily sees what it does. The above code as well as the > IterateeM library is Haskell98. It does not use any unsafe Haskell > functions whatsoever.
Is the IterateeM library available on-line anywhere? I'm familiar enough with your earlier work on enumerators that I can guess what most of what that code is doing, but I'd like a better idea of what ==<< does. -- Dave Menendez <[EMAIL PROTECTED]> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe