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