Hi !
read input_line :: String
throws exception:
Prelude.read: no parse
Hi !
read input_line :: String
throws exception:
Prelude.read: no parse
Short answer: throw away the read
and directly use the input_line
(which is already a string
).
Long answer:
The same problem existed in the Onboarding puzzle template, but I can’t retrieve my post on this object however. The core of the problem is that the textual representation of a string
in Haskell is a sequence of characters between double quotes and the read function expects them to be there. More generally, the read . show
function should always behave like the id
function. Since show "blabla"
outputs "blabla"
and not simply blabla
, the read
function valid input is "blabla"
, not just blabla
. The same way, (show (show (show "blabla")))
outputs """blabla"""
.
So, in your case, input_line
is already a string
whose value is not the representation of a string
, hence the “no parse” error. The only reason it doesn’t raise an error when you launch the template code unmodified is that the returned value is not used and, Haskell being lazy, the read
is not evaluated.
Bonus answer:
A symbol output doesn’t contain double quotes and a easiest way to parse (and then safely use) the direction value is to do something like that:
data Direction = U | UR | R | DR | D | DL | L | UL deriving (Enum, Show, Read)
let d :: Direction
d = read input_line
Thanks. I ran into this while doing the tutorial.