whenJust

以前のエントリで、(つづく)とか書いたけど、続きませんでした。ごめんなさい。

さて、つぎのような関数が欲しい:

module Scrach where

whenJust :: Maybe a -> (a -> IO b) -> IO()
whenJust (Just v) io = io v >> return ()
whenJust Nothing  _  = return ()
*Scrach> whenJust (Just "data") print
"data"
*Scrach> whenJust Nothing print
*Scrach> 

なかなか有用そうな気がするし、実際、少し型が違うけど、同じ目的の関数がxmonadの中にある。これをもっとも短く書くためにはどうすれば良いのか?

じつは、あるモジュールをインポートすれば、ものすごく短くかける。僕の出した答えは、このすぐあと:

module Scrach where
import Data.Foldable

whenJust :: Monad m => Maybe a -> (a -> m b) -> m ()
whenJust = forM_

魔法みたいじゃない? でも、これでちゃんと動く。もしかしたら、知らなかったほうが恥ずかしいのかもしれないけど、自分で思いついたときにはかなり興奮しました、はい。

ちなみに、xmonad版は、こう:

whenJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust mg f = maybe (return ()) f mg