RE: [Haskell-cafe] loop in C , recursion in haskell

On Thu, Mar 25, 2004 at 01:38:44AM +1100, Alex Gontcharov wrote:
Hi,
I am new to haskell and would look to write a function equivalent to the following loop in C
int value = 500000; int part_stack[4]; int *part_ptr = part_stack; for (; value; value /= 10000) *part_ptr++ = value % 10000;
part_stack :: [Int] part_stack = [0,50]
Note that I've performed a memoization optimization--this makes the code both smaller, faster and easier to read! :P
Ignore David, he's pulling your leg. Here's the proper translation: 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 Cheers, Simon

On Wed, 2004-03-24 at 15:51, Simon Marlow wrote:
I am new to haskell and would look to write a function equivalent to the following loop in C
int value = 500000; int part_stack[4]; int *part_ptr = part_stack; for (; value; value /= 10000) *part_ptr++ = value % 10000;
part_stack :: [Int] part_stack = [0,50]
Note that I've performed a memoization optimization--this makes the code both smaller, faster and easier to read! :P
Ignore David, he's pulling your leg. Here's the proper translation:
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
Yes, very nice. Poor Simon, he's clearly been writing too much low-level FFI code recently. :-) Duncan
participants (2)
-
Duncan Coutts
-
Simon Marlow