[Haskell-cafe] A round of golf
Lennart Augustsson
lennart at augustsson.net
Thu Sep 18 20:29:45 EDT 2008
Without any fancy byte strings:
main = do
name:_ <- getArgs
file <- readFile name
print $ length $ lines file
On Thu, Sep 18, 2008 at 6:02 PM, Creighton Hogg <wchogg at gmail.com> wrote:
> Hey Haskell,
> So for a fairly inane reason, I ended up taking a couple of minutes
> and writing a program that would spit out, to the console, the number
> of lines in a file. Off the top of my head, I came up with this which
> worked fine with files that had 100k lines:
>
> main = do
> path <- liftM head $ getArgs
> h <- openFile path ReadMode
> n <- execStateT (countLines h) 0
> print n
>
> untilM :: Monad m => (a -> m Bool) -> (a -> m ()) -> a -> m ()
> untilM cond action val = do
> truthy <- cond val
> if truthy then return () else action val >> (untilM cond action val)
>
> countLines :: Handle -> StateT Int IO ()
> countLines = untilM (\h -> lift $ hIsEOF h) (\h -> do
> lift $ hGetLine h
> modify (+1))
>
> If this makes anyone cringe or cry "you're doing it wrong", I'd
> actually like to hear it. I never really share my projects, so I
> don't know how idiosyncratic my style is.
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list