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.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to