Linksx
Linksx

Reputation: 260

Haskell Exception: Prelude.read: no parse

I am new to Haskell, kinda 2 days since I study Haskell, and I want to do a project with files. I did it already in c++ and now I want to do it in Haskell too. A little part of project is about a library, where I can register a book and a person. Now I want to put book code into a file.txt but to store it as int, not as String, because I have to search and compare this code , with other codes later, and will be easier to compare. Here is my code, and I receive the following error *** Exception: Prelude.read: no parse. Does anyone know how to solve this please?

 import System.IO                      
 main = do
    putStrLn "Please put book details"
    putStr "Code: "
    code <- getLine
    let code1 = read code
    appendFile "book.txt" ("Cod:" ++ code1 ++ "\n")

Upvotes: 3

Views: 3828

Answers (1)

Carcigenicate
Carcigenicate

Reputation: 45726

This fails since you're attempting to read a String as a String.

read is used to parse a String as an object. To parse a String as a String though, you need to add explicit quotes around the String being parsed. Failing to do so will result in the error that you got. You can test this by adding "s around the input when your program asks for it. It should work.

Do you expect code1 to be an int? If that's the case, there's 2 problems (and a couple ways to solve them) :

  1. You need to tell read what type you want it to parse the string as. To do that, use a type annotation. Add :: int after read code.

  2. Since you can't concatenate an int, change code1 in your last line to (show code1) to convert it back to a String.

The problem with the above way is you're converting from, then to a String. You could avoid any converting by keeping it as a String by skipping the read altogether:

import System.IO                      
 main = do
    putStrLn "Please put book details"
    putStr "Code: "
    code <- getLine
    # Check user's input to ensure it's correct. 
    appendFile "book.txt" ("Cod:" ++ code) 

Upvotes: 3

Related Questions