HASKEL***异常:Prelude.read:没有解析(可能重复)



我有这个代码

import Data.Char (isDigit)
eval :: [Int] -> IO()
eval liste = do
putStrLn "Please enter a positive integer or an operater ( + / - / * ): "
input <- getLine
let
ord = words input
cmd = read (head ord) :: Char
in
if isDigit cmd then
let nyliste = (read [cmd] :: Int) : liste in do
print nyliste
eval nyliste
else if isOperator cmd then if null liste || length liste == 1 then do
putStrLn "Invalid input! Start by adding at least two positive integers"
eval liste
else let
fst = head liste
snd = head $ tail liste
in case cmd of
'+' -> let
newValue = fst + snd
oppliste = newValue : drop 2 liste
in do
print oppliste
eval oppliste
'-' -> let
newValue = fst - snd
oppliste = newValue : drop 2 liste
in do
print oppliste
eval oppliste
'*' -> let
newValue = fst * snd
oppliste = newValue : drop 2 liste
in do
print oppliste
eval oppliste
_ -> do
putStrLn "Invalid input! Start by adding at least two positive integers"
eval liste
else do
putStrLn "Invalid input! Start by adding at least two positive integers"
eval liste

isOperator :: Char -> Bool
isOperator c = c == '*' || c == '+' || c == '-'
main :: IO()
main = eval []

当我尝试运行它时,它会给我一个错误:

[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, one module loaded.
ghci> main
Please enter a positive integer or an operater ( + / - / * ):
1
*** Exception: Prelude.read: no parse
ghci>

我看过类似的问题,我知道这个错误与我使用read有关,但我不明白更多。我在这里做错了什么?

head ord只是"1"。为了使read变成Char,它必须是"'1'"。由于String只是[Char],所以您可以只使用第一个元素来获得您想要的内容,而不必在那里使用read

最新更新