MaybeとIOの組み合わせ
あくまで例なんだが,次のJava(AWTプログラミング((http://download.oracle.com/javase/6/docs/api/java/awt/Component.html#getMousePosition%28%29 あぁ... oracle.com ... それはともかく Component#getMousePosition
は実際に null
を返すことがある.)))のコード片を見てほしい.
Point mousePos = getMousePosition(); if (mousePos != null) { system.out.println("mousePos = " + mousePos.toString()); }
突然だがこれと等価(?)なHaskellコードを考えたい.返り値が null
かどうかで分岐するならMaybeモナドというのが定石だが,そんな感じで書いてたら
do let mousePos = getMousePosition case mousePos of Just (x,y) -> putStrLn( "mousePos = (" ++ (show x) ++ ", " ++ (show y) ++ ")" )
みたいなことになった.(試さないで新しく書き下した例なのでコンパイルが通らないかもしれないが... 察してちょうだい.)
これはダサい気がする.演算子やらライブラリ内で定義済みの高階関数で case を置き換えたい.Maybe と IO を組み合わせるライブラリがGHCのどっかにありそうな気がするんだが見つからない.mapM_
とか変なのが色々あるじゃん? 私の探してるのもきっとあると思うんだけど... 自分でなんか型クラスを定義(? よく分からんが)とかいうのは面倒そうだからヤダ.
あと else 節で別メッセージを出すバージョンも欲しい.