Монадические выражения в условных выражениях - GHC компилирует, кабала отказывается

Целый день ломал голову над этим.

В моем коде есть несколько функций, которые выглядят следующим образом:

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

...за исключением того, что это чертовски уродливо, и я никогда не хотел бы включать это в свой код. Кто-нибудь может сказать мне, что происходит? Пожалуйста и спасибо заранее.

15
задан ДМИТРИЙ МАЛИКОВ 3 June 2012 в 09:06
поделиться