IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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とすると、aJustのときに、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