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