haskell错误将用户输入更改为函数中用户定义的数据类型


handleStatements :: [Term] -> IO ()
handleStatements statements = do
let (queries, clauses) = partition isQuery statements
mapM_ (clausesEntailProof clauses) queries
--apply clauses to queries and ignore result
handleArgs :: String-> IO ()
handleArgs args = do
contents <- readFile $ args
case parseInput contents of
Left err -> print err
Right statements -> handleStatements statements

main :: IO ()
main = do
handleStatements(input)
where input = getLine >>= (str -> ((readIO str)::IO[Term])) 

我弄错了。无法将预期类型"[Term]"与实际类型"IO Term"匹配。我该怎么解决这个问题?

如果在where子句中定义input = …,则input的类型为IO [Term],而不是[Term],因此无法将input传递给handleStatements。

你可以写:

main :: IO ()
main = do
input<- getLine >>= (str -> ((readIO str)::IO[Term]))
handleStatementsinput

但是你把事情弄得太复杂了,你可以使用readLn :: Read a => IO a

main :: IO ()
main = do
input <-readLn
handleStatements input

或者用(>>=) :: Monad m => m a -> (a -> m b) -> m b函数替换do块:

main :: IO ()
main = readLn>>=handleStatements

最新更新