Haskell入門 を久しぶりに読み直してみた。P168にMaybeモナドについて少し復習してみた。
getItemWithMonad menu category name =do
subMenu <- lookup category menu
price <- lookup name subMenu
return (category,name,price)
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"