【发布时间】:2021-03-11 05:55:59
【问题描述】:
我无法使用在我的 main :: IO() 函数中返回 Either monad 的函数。 我可以在不使用 Either 的情况下运行我的代码,但我现在使用 Either 来处理错误。 我有以下代码:
parse :: Parser a -> String -> Either TypeRep a
parseFile :: String -> Either TypeRep Game
main :: IO()
main = do
content <- readFile "file.txt"
let info = parseFile content
case info of
Left e -> error $ show e
Right game -> let level = makeGame game
Gloss.play ... level ...
所以如果我的解析函数刚刚返回 a,我的代码就能够执行 Gloss.play 等等。 如何使用 IO 在主中处理 Either。
【问题讨论】:
-
您应该考虑使用
System.Exit.die而不是error。前者是定义明确的IO动作,导致程序退出;后者是一个未定义的IO动作,并且允许不同的实现选择不同的行为(有一些限制——所以至少你不必像 C 那样担心鼻恶魔)。