Applicative Mabyeで条件分岐
なんらかのデータを取得する処理をして、あればそれを使い、なければ、別途データを取得する
というロジックは、よくあるのではないでしょうか。
例えば、このような場合です。
import qualified Data.HashMap.Lazy as HML m = HML.fromList [("k1", "**"), ("k2", "##")] foo x1 x2 = case HML.lookup x1 m of Just a1 -> Just a1 Nothing -> case HML.lookup x2 m of Just a2 -> Just a2 Nothing -> Nothing
キーを二つ用意して、最初のキーで情報が見つかれば、それを使い、見つからなければ、二番目のキーを使います。
lambda > foo "k1" "k2" Just "**" lambda > foo "k1_" "k2" Just "##" lambda > foo "k1_" "k2_" Nothing
case
が2つあって冗長です。
Maybe
モナドでa >>= b
とすると、a
がJust
のときに、b
に移ります。が、やりたことはこの逆で、Nothing
だったらb
に移るということです。このような時はApplicative
を使うと良さそうです。
foo'' x1 x2 = HML.lookup x1 m <|> HML.lookup x2 m
lambda > foo'' "k1" "k2" Just "**" lambda > foo'' "k1_" "k2" Just "##" lambda > foo'' "k1_" "k2_" Nothing