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 節で別メッセージを出すバージョンも欲しい.