Rob Hoelz wrote:
            item <- linked_list_getdata listPtr
            next <- linked_list_next listPtr
            cStr <- peek item
            hStr <- peekCString cStr
            t <- linkedListToStringList next
            return (hStr : t)
item <- linked_list_getdata listPtr
next <- linked_list_next listPtr
cStr <- peek item
hStr <- peekCString cStr
fmap (hStr :) linkedListToStringList next


This is just ugly...making the recursive call first, THEN consing the
value on?  However, this is the only way I could think of doing it.  I
figure there are three possibilities from here:

I think you're over-valuing tail recursion. It's not an exciting thing in a lazy language the way it is in a pure language. The change I made above may not result in particularly better code, although it is more concise.


And as long as I'm asking, is there some kind of monadic function
composition operator?  I'd like to clean up the above with something
like peekCString . peek . linked_list_getdata...

Yes, that's what >>= and =<< are.

hStr <- peekCString =<< peek =<<  linked_list_getdata listPtr

fmap (hStr :) linkedListToStringList =<< linked_list_next listPtr


...or even...

liftM2 (:) (peekCString =<< peek =<<  linked_list_getdata listPtr)
          (linkedListToStringList =<< linked_list_next listPtr)

It's really a matter of taste.... you could turn the arrows round, too.

Jules
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to