問題
scalaで関数型プログラミングを調べると真っ先に出てくるライブラリとしてScalazとCatsがあるが、これらの違いとどちらを使えばいいのかがわからない。
またこれらは混在させていいのだろうか?
回答
catsを使いましょう(理由は以下で解説しています)。
混在させるとお互いのライブラリ内の同名のクラスでも(例: scalaz版Monad、cats版Monad)型が非互換であるため混乱が起きやすいです。
なるべくcatsのみを使い、やむなく混在せざるを得ない場合はcats側に寄せることをおすすめします。
またargonaut-io/argonautとcirce/circeなどほぼ同じ目的のライブラリでScalaz版とCats版が存在するケースがありますが、上記の理由でなるべくCats版を使うことをおすすめします。
解説
Scalaz
Scalazはscala上で関数型プログラミングをすることを支援するライブラリです。
2008/11/30にリポジトリが作られました。
各種モナドや便利な型クラスを導入してくれます1。
Cats
Catsもまたscala上で関数型プログラミングをすることを支援するライブラリです。
2015/01/25にリポジトリが作られました。
こちらもScalazとほぼ同じ概念を導入してくれます。
Catsが生まれた背景(ScalazのCoC問題)
この2つは非常によく似ています。
以下のscaladocを見ればわかりますがクラスでも同名同機能のものや異名同機能のものが多数あります。
ではなぜCatsが生まれたかというと、Scalazで過去ある騒乱があったためです。
OSSコミュニティがある日突然壊れたときにどうすればいいか - xuwei-k
こちらが非常に詳しいのですが2、簡単に説明すると
- scalazの初期からcontributeしている開発者の一人Tony Morris(@dibblego)が粗暴な振る舞いをしていた3
- 我慢できなくなった他のscalaz開発者が彼をCoC(Code of Conducts)を使ってscalaz開発から追い出そうとした
- 数ヶ月の論争の末、クーデターは失敗したがコミュニティに大きなダメージを残しScalazの評判も低下した
- 上に嫌気が差した?人4がscalaz代替であるcatsを作成した
という流れが2014~2015年ごろにあったようです。
Catsを使うべき理由
1. CatsはScalazを元にいくつかの点で改善されている
型クラスの名前やクラスの継承関係などを見ればわかりますが、互換性や歴史的経緯によりScalazでは修正したいけどできない点をCatsは後発である利点を生かして修正しています。
pointメソッドではなくpureメソッドへ統一されていることなどがわかりやすいと思います。
2. Catsにリソース(物・ドキュメント・人)が流れている
CatsはScalazと比べて後発ですが、Maven Repositoryで見るとすでにscalaz-coreよりもcats-coreの方が利用ライブラリが多い状態です。
GithubのStarの点でもCatsは大幅に後発であるにもかかわらずScalazの3/4のStarを獲得しています。
https://star-history.t9t.io/#scalaz/scalaz&typelevel/cats
また、以下のGoogleトレンドから見ても2017/04頃を境にScalazとCatsの人気が入れ替わっていることがわかります。
scala scalaz, scala cats - 調べる - Google トレンド
あくまで個人的感覚ですがここ2年以内に作られたライブラリはscalazよりcatsに依存しているケースが多いです。
3. Scalaコンパイラ開発元の(実質的な)公式サポートライブラリからscalazが外れた
scalaの開発元(lightbend)はscala/community-buildsというリポジトリでscalaの主要なライブラリとscalaのnightly-buildとの互換性をチェックしています。
そこにはScalazもCatsも含まれていたのですが、先日scalazが取り除かれました。
それに対する意見や説明などは次が詳しいです。
- CoC-compatible Community Builds - Meta Discourse - Scala Contributors
- Taro L. Saitoさんのツイート: "Scala Community Build、Airframeも参加しているのでメンテナの苦労がわかるけれど、メンテナがどれだけ各プロジェクトとのコミュニケーションで苦労しているか知った上でコメントしている人は少ない気がする。僕もこのスレッドを読んでようやく事情を理解した https://t.co/ZR1BPUZbB7"
- Kenji Yoshidaさんのツイート: "それ( https://t.co/8B35y81DST )言うなら、中の人以外でここまで( https://t.co/QbEEVSzQ95 )やってる人見たことないし(z以外のライブラリ全てに対してやってる)、Scalazが過去実際何度もScala自体のbug発見に役立ったことを知っているし、なんならその理由があるから"
建前と本音が入り混じり分かりづらいですが、結局のところ件のCoC問題が尾を引いているのだと思います。