[Haskell-cafe] loop in C , recursion in haskell
Duncan Coutts
duncan at coutts.uklinux.net
Wed Mar 24 16:23:14 EST 2004
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
More information about the Haskell-Cafe
mailing list