Scalaの関数型ライブラリ(?)であるCatsには色々な型クラスが実装されていて、だいたい良く使うのはMonoid
とかMonoidK
とかApplicative
とかなんだけど、その昔関数型FizzBuzzのことを考えていたときにAlternative
が使われていて、そのことがずっと気になっていた。
形式的には、Alternative
はApplicative
からap
とpure
を、そしてMonoidK
からempty
とcombineK
を受け継いでいて、新規の実装は無い。とはいえそんなこと言われてもわからない!!!!!
風船を持つ子供と両親のイラスト(男の子) | かわいいフリー素材集 いらすとや
くっつけて何か良いことがあるからくっつけているのだろうが、何か具体的な例がないと使いどころが分からない。Monoidとかだったら「ああこういう概念の定式化か」とすんなり分かるのだがAlternativeは良く分かりかねていた。結局何がしたいの?
困ったときはGoogle先生に訊いてみよう。調べてみるといくつか具体例がある。どう使うのかというと、FizzBuzzを実装したり
パーサを書いたり
オオカミとヤギとキャベツとを移動しようとしたり
している。う〜ん。
全然分からないので、TwitterをAlternative 最強 令和最新版
とかで検索していると(嘘。Alternative scala cats
で検索していた)、次のようなツイートを見付けた。
Super excited to be working on a command-line program because it means I get to use decline and it's so much fun. Highly, highly recommended. https://t.co/9QrMp8UHzC
— 🔥 Tpol Chico (@tpolecat) 2019年10月30日
It’s based on Alternative (which extends Applicative with MonoidK) so you get mapN for “all of these” and <+> for “orElse”. It’s really beautiful.
— 🔥 Tpol Chico (@tpolecat) 2019年10月31日
It’s based on Alternative (which extends Applicative with MonoidK) so you get mapN for “all of these” and <+> for “orElse”. It’s really beautiful.
これを見たとき、なるほどー!!! と思った。Alternative
は、Applicative
から「すべて満たせ」を受け継ぎ、MonoidK
から「いずれか選べ」を受け継いでいるのだ。そして、そのような性質を備えているようなデータ構造に対して力を発揮するのだ。
- パーサは、1つのルールが要求する全ての条件を満たす場合にのみパースに成功し、さもなくば次のルールを適用しようとする
- FizzBuzzは、FizzBuzzになるか、Fizzになるか、Buzzになるか、いずれかでもない、というルールを順に適用しようとする
- 可能なルールだけ残して、オオカミとヤギとキャベツとを川の向こうに移動させる合法な手の組み合わせを導出しようとしている
だからAlternativeという名前が付けられているのか、と納得した。