2009-05-07 16 views
65

せずに、私はこのようになりますHaskellの中に何かをしたい場合はIOは、あるいは:Haskellの「何もしない」

main1 = do s <- getLine 
      if s == "foo" then putStr "You entered foo" 

を一切elseをありませんので、明らかにこれは合法ではありません。私が考えた1つの選択肢:

nop :: IO() 
nop = sequence_ [] 

main2 = do s <- getLine 
      if s == "foo" then putStr "You entered foo" else nop 

これは少し冗長ですが、必要であれば解決します。しかし、nopの組み込みバージョンがないと私は驚くだろう。また

:これは、より簡潔で

doIf :: Bool -> IO() -> IO() 
doIf b m = if b then m else nop 

main3 = do s <- getLine 
      doIf (s == "foo") (putStr "You entered foo") 

が、構文は特に素敵ではありません。繰り返しになりますが、すでに存在するものを見つけることには驚かないでしょう。

これを行うにはどのような方法が良いですか?

答えて

90

モナドで無操作しないための最も簡単な方法は次のとおりです。

return() 

しかし、あなたがやっている特定のイディオムのために、すでにあなたのために作らコンビネータがあります:

import Control.Monad 
main = do s <- getLine 
      when (s == "foo") $ putStr "You entered foo" 

このwhenコンビネータはまさにあなたのdoIfコンビネータのように振る舞う:)

+0

おっと、私はreturn()について考えましたが、実際にそれが返されると考えていました(つまり、do式の残りの部分を短絡しています)。私の悪い。いつものポインタありがとう。 –

+3

戻り値はそれほど悪い名前ですね: – bdonlan

+7

@Daveハスケルでの 'return'は言語構造ではないことを覚えておいてください。これは単なる関数です(bdonianが言うように、悪名を選んだ)。戻り値は制御フローに影響しません。何かを書くことができます: 'do {s < - getLine; return(); putStrLn s} 'はうまく動作します。 –

17

あなたは、この場合には、関数を見つけるためにHoogleを使用することができます。when

Hoogleでは、タイプシグネチャを入力することができます。タイプライブラリと標準ライブラリで一致する関数を見つけるには、型と並べ替えの引数を統一します。

あなたの場合、doIf関数のタイプを入力してください:Bool -> IO() -> IO() whenがここでは3番目の答えですが、逆のunlessもあります。

関連する問題