Isaac Dupree <[EMAIL PROTECTED]> wrote: > > linkedListToHaskellStringList :: LinkedList -> IO [String] > > linkedListToHaskellStringList listPtr = > > let convertList' ptr = > convertList' :: LinkedList -> [IO String], I infer?
Correct. > > if listIsNull ptr > > then > > [] > > else > are you doing IO here or not? You need a 'do' if you are (else this > is a syntax error), but IO /= [], so what is the function returning? My mistake; I left off the 'do.' My original code does have it, though. I figure since the null case returns [] (which should be a valid [IO String], and str is an IO String, it should work. In fact, if I take out the next <- ... line and substitute ptr for next, it compiles. But that's not exactly desirable behavior...=P > > let str = peekCString =<< (linked_list_getdata ptr) > > next <- linked_list_next ptr > > str : (convertList' next) > > in > > sequence $ convertList' listPtr > > > > listIsNull :: LinkedList -> Bool > > listIsNull (LinkedList ptr) = ptr == nullPtr > > I'd recommend recursion without the 'sequence', I think, so you can do > IO along the way - traversing the LinkedList - and then 'return' the > list made from (:). (and throw in unsafeInterleaveIO if you're > feeling sadistical and want parts of the traversal to be performed at > unspecified later dates) The problem I have with that is that I'd have to do something like this: str <- peekCString =<< (linked_list_getdata ptr) next <- linked_list_next ptr rest <- linkedListToHaskellStringList next return (str : rest) I don't like this because it's not really tail recursive. I've been told tail recursion is overrated, but since I don't really know how long the C linked lists are going to be (could be 10 elements, could be 100), I don't think avoiding a stack overflow is overrated. Thanks, Rob _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe