
Hello, I'm writing a Haskell code which consists to read a text file, parse it and thansform the parsing result on a specific language.I have a function affiche which takes a data type Ctrl and returns a String. This is the transformation funtion.I have also anothe function parsctrl, which parse the contents of a text file ("ctrl.txt") and after looks for a specific value ("A01") in the parse result (function cherchectrl). I need to use the result of the parsectrl function in another function fc. The code is composed of three functions parsectrl = do f <- readFile "ctrl.txt" let Right r = parse parseCtrl " " f let rez =cherchectrl ( r) "A01" return (rez) fc[] =[] fc((door,[(all,v1),(alt,v2),(lint,v3),(w,v4),(r,v5),(loc,v6),( etat,v7),(ruin,v8)]):ls ) = ("&OUV ID='"++door ++"', ALLEGE="++show((moi v1)/1000)++", LINTEAU="++show((moi v3)/1000)++", LARGEUR="++show((moi v4)/1000)++", COEF=0.7, ALT="++show((moi v2)/1000)++", LOCIDS='"++v6++"', CTRLID='"++ v7++"', CTRLID_RUIN='"++ v8++" /" ++"\n" ++"&CTRL ID='"++v7++"', " ++ "ON_INI=.FALSE., DURATION=0 / \n"++"&CTRL ID='"++v8++"', LOCID='"++ ((parses("'"++v6++"'"))!!0) ++affiche(parsectrl)++ " / \n\n" )++fc(ls) The parsectrl returns an IO String, but the function affiche needs a String as input and even when I tried to adapt the affiche function to take an IO String -> String I can't.the result of fc must be a String too. The IO String comes from the parsectrl function. Can you help me to solve this problem: how can I transform an IO String to a String. Thank you by advance.

You can't transform an IO String into a String. This is one of the purposes
of monads: to make it possible to work with things like IO, where it is
impossible to turn an IO a into an a. The result of performing an IO action
can be *bound* using (>>=) or <- in do notation so that the String is
available for the rest of the computation:
do
f <- readFile "ctrl.txt"
Right r <- parseCtrl f
cherchectrl r "A01"
Note that there's no need to wrap identifiers in (): (r) is the same as r,
(rez) is the same as rez. And there's no need to say do { let r =
something; return r }. You can just say do { something }.
On Fri, Oct 23, 2015 at 8:32 AM chanti houda
Hello, I'm writing a Haskell code which consists to read a text file, parse it and thansform the parsing result on a specific language. I have a function *affiche *which takes a data type Ctrl and returns a String. This is the transformation funtion. I have also anothe function parsctrl, which parse the contents of a text file ("ctrl.txt") and after looks for a specific value ("A01") in the parse result (function *c**herchectrl*). I need to use the result of the *parsectrl *function in another function *fc*. The code is composed of three functions
parsectrl = do f <- readFile "ctrl.txt" let Right r = parse parseCtrl " " f let rez =cherchectrl ( r) "A01" return (rez)
fc[] =[] fc((door,[(all,v1),(alt,v2),(lint,v3),(w,v4),(r,v5),(loc,v6),( etat,v7),(ruin,v8)]):ls ) = ("&OUV ID='"++door ++"', ALLEGE="++show((moi v1)/1000)++", LINTEAU="++show((moi v3)/1000)++", LARGEUR="++show((moi v4)/1000)++", COEF=0.7, ALT="++show((moi v2)/1000)++", LOCIDS='"++v6++"', CTRLID='"++ v7++"', CTRLID_RUIN='"++ v8++" /" ++"\n" ++"&CTRL ID='"++v7++"', " ++ "ON_INI=.FALSE., DURATION=0 / \n"++"&CTRL ID='"++v8++"', LOCID='"++ ((parses("'"++v6++"'"))!!0) ++ *affiche(parsectrl)*++ " / \n\n" )++fc(ls)
The parsectrl returns an IO String, but the function affiche needs a String as input and even when I tried to adapt the affiche function to take an IO String -> String I can't. the result of fc must be a String too.
The IO String comes from the parsectrl function. Can you help me to solve this problem: how can I transform an IO String to a String.
Thank you by advance.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

Or rather, you can just say do { return something } or do { return $
something } of "something" is a more complicated expression.
On Fri, Oct 23, 2015 at 10:16 AM Rein Henrichs
You can't transform an IO String into a String. This is one of the purposes of monads: to make it possible to work with things like IO, where it is impossible to turn an IO a into an a. The result of performing an IO action can be *bound* using (>>=) or <- in do notation so that the String is available for the rest of the computation:
do f <- readFile "ctrl.txt" Right r <- parseCtrl f cherchectrl r "A01"
Note that there's no need to wrap identifiers in (): (r) is the same as r, (rez) is the same as rez. And there's no need to say do { let r = something; return r }. You can just say do { something }.
On Fri, Oct 23, 2015 at 8:32 AM chanti houda
wrote: Hello, I'm writing a Haskell code which consists to read a text file, parse it and thansform the parsing result on a specific language. I have a function *affiche *which takes a data type Ctrl and returns a String. This is the transformation funtion. I have also anothe function parsctrl, which parse the contents of a text file ("ctrl.txt") and after looks for a specific value ("A01") in the parse result (function *c**herchectrl*). I need to use the result of the *parsectrl *function in another function *fc*. The code is composed of three functions
parsectrl = do f <- readFile "ctrl.txt" let Right r = parse parseCtrl " " f let rez =cherchectrl ( r) "A01" return (rez)
fc[] =[] fc((door,[(all,v1),(alt,v2),(lint,v3),(w,v4),(r,v5),(loc,v6),( etat,v7),(ruin,v8)]):ls ) = ("&OUV ID='"++door ++"', ALLEGE="++show((moi v1)/1000)++", LINTEAU="++show((moi v3)/1000)++", LARGEUR="++show((moi v4)/1000)++", COEF=0.7, ALT="++show((moi v2)/1000)++", LOCIDS='"++v6++"', CTRLID='"++ v7++"', CTRLID_RUIN='"++ v8++" /" ++"\n" ++"&CTRL ID='"++v7++"', " ++ "ON_INI=.FALSE., DURATION=0 / \n"++"&CTRL ID='"++v8++"', LOCID='"++ ((parses("'"++v6++"'"))!!0) ++ *affiche(parsectrl)*++ " / \n\n" )++fc(ls)
The parsectrl returns an IO String, but the function affiche needs a String as input and even when I tried to adapt the affiche function to take an IO String -> String I can't. the result of fc must be a String too.
The IO String comes from the parsectrl function. Can you help me to solve this problem: how can I transform an IO String to a String.
Thank you by advance.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
participants (2)
-
chanti houda
-
Rein Henrichs