Recursion replaces loops. If it needs to be monadic or not depends on what you want to do.
On Sun, Dec 19, 2010 at 10:53 AM, ender <crazyen...@gmail.com> wrote: > 2010/12/19 Henning Thielemann <lemm...@henning-thielemann.de>: > > > > On Sun, 19 Dec 2010, ender wrote: > > > >>> do > >>> alloca $ \value -> do > >>> poke value (500000::Int) > >>> allocaArray 4 $ \part_stack -> do > >>> alloca $ \part_ptr -> do > >>> poke part_ptr part_stack > >>> let loop = do > >>> val <- peek value > >>> if val == 0 then return () else do > >>> p <- peek part_ptr > >>> poke p (val `rem` 10000) > >>> poke part_ptr (p `plusPtr` 1) > >>> poke value (val `quot` 10000) > >>> loop > >>> loop > >> > >> and I really think that's not a "haskell way", it's just translate c > >> code into haskell code byte by byte > >> My question is: how to translate above c code into haskell in "haskell > >> way" > > > > If the count of loop runs does not depend on results of the loop body, > then > > 'mapM' and 'mapM_' applied to the list of increasing pointers are your > > friends. In your case, the loop aborts when 'val' becomes zero. I'm > > certainly thinking too complicated, but you might use MaybeT IO () (e.g. > > from transformers package) and abort 'mapM_' with 'mzero' when 'val' > becomes > > zero. (MaybeT IO a) is like an IO monad with an early exit (somehow an > > exception) option. > > > Hi Henning: > Thanks for your quick reply. So recursive and monad is the proper > way to simulate loop,right? > > Thanks and BR > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe