2025年3月29日土曜日

モナドの活用

 Haskell入門 を久しぶりに読み直してみた。P168にMaybeモナドについて少し復習してみた。

getItemWithMonad menu category name =do
  subMenu <- lookup category menu
  price <- lookup name subMenu
  return (category,name,price)

途中、Nothingを記述しなくても自動的に、該当しなければ、最後はNothingになる。うまくできていると思う。
これを、手続き型言語で、実現しようとすると条件分岐に頼らざるを得ないけど、その必要もない。
このへんが、関数型言語のモナドの強みなのかもしれない。

追記>試しに、ChatGPTで、ELMのMaybeを使うコードに変換してみた。ELMはモナドをサポートしていないため、少しコード量が増えてしまうようだ。
type alias Menu = Dict String (Dict String Float)
getItemWithMonad : Menu -> String -> String -> Result String (String, String, Float)
getItemWithMonad menu category name =
    case Dict.get category menu of
        Just subMenu ->
            case Dict.get name subMenu of
                Just price -> 
                    Ok (category, name, price)
                Nothing -> 
                    Err "Item not found"
        Nothing -> 
            Err "Category not found"

0 件のコメント:

コメントを投稿