add something to a list

Jay Cox
Sun, 17 Feb 2002 13:33:25 -0600 (CST)

On Sun, 17 Feb 2002, Cagdas Ozgenc wrote:

> Hi Adrian,
> How can I add a function that sorts this list that I read from the user and
> accumulate using the function that you described? I am not asking for a sort
> algorithm of course, I am just wondering how to feed the IO Path as an input
> to a sort function? Is it suppose to look like this:
> sort :: IO Path -> IO Path

It could.  (to make it simpler you may need a sort' :: Path -> Path
function though, as in.

 sort getpath = do x <- getpath  -- x has type Path
                   return (sort' x)
      where sort' = ....  -- sort' is typed as above and produces
                          -- a sorted list list of
                          -- type Path

> or
> sort :: IO Path -> Path

The point of the IO monad is to thread the state of the "World" (which
your program modifies)  explicitly through your program.  The pure
functions are the plumbing.  A function of type IO Path -> Path cannot
modify the world state since the world state is not the result of function
application *.

> How do you iterate over IO Path?

Um, I cant think of another good introductory way than that sort :: IO
Path -> IO Path I mentioned above.

Jay Cox

* Minus the obvious facts that haskell implementions obviously do:
   1. modify the world state as executing functions create new
      datastructures that need to be allocated, may cause garbage collection,
      maybe cause new heap allocation (do they?) or otherwise
      cause program termination (run out of stack/heap/ ... ), etc.
   2. unless it uses sort unsafeIO and/or other "hacks."  unsafeIO
      generally should not be used.

PS:  Anybody got any other suggestions for IO monad entry-level docs?
     I suppose Haskell Wiki on might be good place to allude