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