为这个问题挠了一天。
我的代码中有一些函数如下所示:
function :: IO (Maybe Whatever)
function = do
monadFun
yaySomeIO
status <- maybeItWillFail
if checkStatus status -- Did we succeed?
then monadTime >>= return . Just . processItPurely
else return Nothing
ghci 将毫无问题地以交互方式加载和运行它,ghc 将愉快地编译它。然而,通过 cabal 运行它给了我这个:
myProgram.hs:94:16:
Unexpected semi-colons in conditional:
if checkStatus status; then monadTime >>= return . Just . processItPurely; else return Nothing
Perhaps you meant to use -XDoAndIfThenElse?
无论这个-XDoAndIfThenElse
选项是什么,我似乎都无法在任何文档的任何地方找到它的踪迹。为什么 cabal(或者此时是 ghc?)因为我使用 IT 首先放在那里的分号而对我大喊大叫?或者在 if-then-else 语句中使用单子表达式只是一个坏主意?
请注意,阴谋集团根本不会抱怨这一点:
case checkStatus status of
True -> monadTime >>= return . Just . processItPurely
_ -> return Nothing
...除了这很难看,我永远不想把它放在我的代码中。谁能告诉我发生了什么事?请提前致谢。