Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaのCatsのAlternativeチョットワカル

Scalaの関数型ライブラリ(?)であるCatsには色々な型クラスが実装されていて、だいたい良く使うのはMonoidとかMonoidKとかApplicativeとかなんだけど、その昔関数型FizzBuzzのことを考えていたときにAlternativeが使われていて、そのことがずっと気になっていた。

itchyny.hatenablog.com

形式的には、AlternativeApplicativeからappureを、そしてMonoidKからemptycombineKを受け継いでいて、新規の実装は無い。とはいえそんなこと言われてもわからない!!!!!

ApplicativeとMonoidKの子、Alternative

風船を持つ子供と両親のイラスト(男の子) | かわいいフリー素材集 いらすとや

くっつけて何か良いことがあるからくっつけているのだろうが、何か具体的な例がないと使いどころが分からない。Monoidとかだったら「ああこういう概念の定式化か」とすんなり分かるのだがAlternativeは良く分かりかねていた。結局何がしたいの?

困ったときはGoogle先生に訊いてみよう。調べてみるといくつか具体例がある。どう使うのかというと、FizzBuzzを実装したり

qiita.com

パーサを書いたり

typelevel.org

オオカミとヤギとキャベツとを移動しようとしたり

eed3si9n.com

している。う〜ん。

??????

ヤギのイラスト | かわいいフリー素材集 いらすとや

全然分からないので、TwitterをAlternative 最強 令和最新版とかで検索していると(嘘。Alternative scala catsで検索していた)、次のようなツイートを見付けた。

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という名前が付けられているのか、と納得した。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?