これで1日頭を悩ませています。
私のコードには、次のような関数がいくつかあります。
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
オプションが何であれ、ドキュメントのどこにもその痕跡を見つけることができないようです. なぜカバール (またはこの時点でこれは ghc ですか?) が、IT が最初にセミコロンを使用したことについて私に怒鳴っているのですか? それとも、if-then-else ステートメントでモナド式を使用するのは悪い考えですか?
cabal はこれについてまったく文句を言わないことに注意してください。
case checkStatus status of
True -> monadTime >>= return . Just . processItPurely
_ -> return Nothing
...これは地獄のように醜いことを除いて、これを自分のコードに入れたくありません。誰が何が起こっているのか教えてもらえますか? よろしくお願いします。