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
传递给handleStatement
s。
你可以写:
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