Я почесал голову на день над этим.
У меня есть несколько функций в моем коде, которые выглядят следующим образом:
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 скомпилирует его с радостью. Однако, запустив это через кабаль, это дает мне следующее:
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
, я не могу найти его в любом месте любой документации.
Почему каббал (или этот ghc к этому моменту?) Кричит на меня, чтобы использовать полуколоны, которые там помещают в первую очередь? Или использует монадические выражения в операторах if-then-else только плохую идею?
Обратите внимание, что cabal не жалуется на это вообще:
case checkStatus status of
True -> monadTime >>= return . Just . processItPurely
_ -> return Nothing
... за исключением того, что это уродливо, и я никогда не захочу поместить это в свой код. Может ли кто-нибудь сказать мне, что происходит? Пожалуйста, спасибо заранее.