2012-06-03 7 views
15

これ以上の日に頭を掻き回していました。条件文のMonadic式 - 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オプションが何であれ、私はどこでも任意のドキュメントのそれの痕跡を見つけることができないよう: 徒党を介してこれを実行している、しかし、私はこれを提供します。 IT部門が最初に置いたセミコロンを使用していると私に怒鳴りを出すのはなぜカバルですか(それともこの時点でghcですか?)。あるいは、if-then-elseステートメントでモナド式を使用していますか?秘密結社がすべてでこの文句はありません

注:この除く

case checkStatus status of 
    True -> monadTime >>= return . Just . processItPurely 
    _ -> return Nothing 

...

は地獄のように醜いと私は私のコードでこれを入れたいことはありませんでした。 誰も私に何が起こっているか教えてもらえますか?事前に感謝してください。

答えて

27

do - ブロックでif -expressionsインデントの「正しい」方法は、このように、さらにifよりelsethen行をインデントすることです。

function = do 
    monadFun 
    yaySomeIO 
    status <- maybeItWillFail 
    if checkStatus status -- Did we succeed? 
     then monadTime >>= return . Just . processItPurely 
     else return Nothing 

doブロックにおけるくぼみの同量を有する線は、通常、別個のステートメントとして扱われるからです。

しかし、DoAndIfThenElseという拡張子があります。この拡張子は、あなたのやり方で書くことができます。この拡張はHaskell 2010で標準化されました.GHCがデフォルトで有効にしている理由です。

Cabalはこれらのことをより明確にする必要がありますので、Cabalで使用するには、.cabalファイルに記載するか、{-# LANGUAGE DoAndIfThenElse #-}をモジュールの上部に追加する必要があります。

+3

ありがとう、私はちょうど必要に応じてインデントを追加します! –

6

これはあなたの質問に対する直接の回答ではありませんが、MaybeTを利用してif文を削除することはできます。また、foo >>= return . barbar <$> fooと同じです。 (<$>Control.Applicativeからである、とfmapと同じである)

function :: MaybeT IO Whatever 
function = do 
    lift monadFun 
    lift yaySomeIO 
    status <- lift maybeItWillFail 
    guard (checkStatus status) 
    processItPurely <$> lift monadTime 

だけ迷惑がlift秒の無償散水ですが、それらを取り除くために方法があります。

+1

このアプリケーションが完了したら、私はハスケルの本をもう一度打つ必要があります。 ApplicativeやFunctorsのようなことは聞いたことがありますが、使ったことはありません。より多くの知識が私のコードをよりセクシーにすることができれば、私はそれをすべて得ます。 –