[Haskell-cafe] Re: How to generalize executing a series of commands, based on a list?

Peter Schmitz ps.haskell at gmail.com
Thu Nov 18 15:20:10 EST 2010


Thank you very much for the help. Good tips for improving my code design.
I'm new to sequence, mapM, and mapM_; I've seen mapM a lot while reading
code and wanted to learn it; now I have a reason! Thanks.
-- Peter


On Thu, Nov 18, 2010 at 5:40 AM, steffen <steffen.siering at googlemail.com>wrote:

> 1. Write one routine, which does all the work for just one command.
> 2. use sequence or mapM, mapM_ from Control.Monad (depending on your
> needs),
>   to apply your function to a list of commands
>
> accumulating results you may want to process the output of "sequence"
> or use the WriterT Monad Transformer.
>
> If you want to stop processing the rest of the list on error, either
> write a recursive function yourself or use foldM or use ErrorT Monad
> Transformer.
>
> On Nov 18, 3:03 am, Peter Schmitz <ps.hask... at gmail.com> wrote:
> > I am able to use System.Cmd (system) to invoke a shell command
> > and interpret the results.
> >
> > Please see the code below that works okay for one such command.
> > (I invoke a program, passing two args.)
> >
> > I am wondering how to generalize this to do likewise for a
> > series of commands, where the varying args (filenames, in this
> > case) are in a list ('inOutLeafs').
> >
> > I will also want to accumulate some results; probably just a
> > failure count at this time.
> >
> > Any advice or pointers to examples would be much appreciated.
> >
> > Thanks in advance,
> > -- Peter
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > > run :: ... -> IO (Int)    -- will return a fail count
> > > run
> > >    -- some args to this function here...
> > >    = do
> > >       -- ... set up: inputLeafs, outputLeafs, etc.
> >
> > >       -- zip two lists of filenames:
> > >       let inOutLeafs = zip inputLeafs outputLeafs
> >
> > >       -- the first pair for the first command:
> > >       let (inFile1,outFile1) = head inOutLeafs
> >
> > >       -- build 1st command using 1st pair of filenames:
> > >       let cmd1 = ...
> >
> > >       exitCode <- system cmd1
> > >       case (exitCode) of
> > >          ExitSuccess -> do
> > >             putStrLn $ "-- OK."
> > >             return 0
> > >          ExitFailure failCnt -> do
> > >             putStrLn $ "-- Failed: " ++ show failCnt
> > >             return 1
> >
> > _______________________________________________
> > Haskell-Cafe mailing list
> > Haskell-C... at haskell.orghttp://
> www.haskell.org/mailman/listinfo/haskell-cafe
>  _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20101118/ac9af795/attachment.html


More information about the Haskell-Cafe mailing list