I´m trying to implement a function that saves the highest score of a player in a game through a txt file. This is the code:
import System.IO
import System.Directory
saveHighScore:: Int -> IO()
saveHighScore num = do
let stringNum = "" show num
let file = "score.txt"
writeFile file stringNum
readHighScore:: IO() -> Int
readHighScore = do
content <- openFile "score.txt" ReadMode
score <- hGetContents content
let highScore = read score :: Int
return highScore
But the code is giving this error and I don´t know what to do:
localStorage.hs:17:9: error:
* Couldn't match expected type: IO () -> Int
with actual type: IO Int
* In a stmt of a 'do' block:
content <- openFile "score.txt" ReadMode
In the expression:
do content <- openFile "score.txt" ReadMode
score <- hGetContents content
let highScore = ...
return highScore
In an equation for `readHighScore':
readHighScore
= do content <- openFile "score.txt" ReadMode
score <- hGetContents content
let highScore = ...
....
|
17| content <- openFile "score.txt" ReadMode
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
CodePudding user response:
The error message is telling you exactly what's wrong. You claim your function has type IO () -> Int, but it's impossible for any interesting function to have this type. The only possible implementation is a constant function that ignores the IO () and produces the same result regardless of its input.
The right type is the one the compiler is suggesting, IO Int.
CodePudding user response:
In the other answer, amalloy gives the explanation.
To fix the issue, the easiest step is to remove the type declaration:
readHighScore = do
content <- openFile "score.txt" ReadMode
score <- hGetContents content
let highScore = read score :: Int
return highScore
Then load the file in GHCi and query GHCi about the type:
> :t readHighScore
readHighScore :: IO Int
That's the type. You can add it back as a type declaration:
readHighScore :: IO Int
readHighScore = do
content <- openFile "score.txt" ReadMode
score <- hGetContents content
let highScore = read score :: Int
return highScore
There are lots of tools and add-ons that can do this in your IDE of choice, but GHCi works everywhere, I should think.
