I don't think you can do what you want to using standard lists, not without some dirty trickery... But you can define a datatype for such a purpose which would essentially have to put the tail into the Monad. Disadvantage: you would have to redo lots of the list stuff yourself. I had once started writing such a module, it's attached... With this you can write your program as follows: main = do xs <- getStrings putStrLn(headML xs) getStrings = do { x <- getLine; if x=="stop" then return NIL else return (x:<:getStrings) } So, this uses headML instead of head, NIL instead of [], etc. But the things that makes everything work is the different cons-operator, the :<: which allows the list tail to still sit in some monad. Hope this helps Stefan Kahrs