add something to a list

Adrian Hey ahey@iee.org
Sun, 17 Feb 2002 11:38:11 +0000


On Sunday 17 February 2002 08:20, christophe certain wrote:
> Hi,
>
> I'm a poor lonesome newbie in Haskell world, and I would like to add a
> string typed on the prompt to a list of strings which is already defined.
>
> It would look like something like :
>
> type Path = [String]
>
> currentPath::Path
> currentPath = []
>
> getpiece ::IO String
> getpiece  =  do c <-getLine
> 		return c
>
> putpiece:: String->Path
> putpiece a = a:currentPath
>
> and then I could combine the two functions, but obviously it doesn't work.
> I dare understand that it's impossible isn't it ?
>
> Maybe the only way is to create a new [String] each time I want to add a
> new string ? No ?
>
> Christophe Certain

You seem to expect currentPath to be updated by putpiece? This won't happen
in Haskell. Once you've declared
       currentPath=[]
it will always be []. 

Values never change. If you want the functional equivalent of accumulator 
variables they have to be an argument of a recursive function. So try this..

getPath :: Path -> IO Path
getPath currentPath = do
	piece <- getLine
	if piece == ""	then return currentPath
			else getPath (piece:currentPath)

initialCurrentPath::Path
initialCurrentPath = []

main :: IO ()
main = do
	path <- getPath initialCurrentPath
	putStrLn (show path)

Regards
--
Adrian Hey