ScalazよりもCatsを使いましょう

# 問題

scalaで関数型プログラミングを調べると真っ先に出てくるライブラリとして[Scalaz](https://github.com/scalaz/scalaz)と[Cats](https://github.com/typelevel/cats)があるが、これらの違いとどちらを使えばいいのかがわからない。
またこれらは混在させていいのだろうか？

# 回答

catsを使いましょう(理由は以下で解説しています)。

混在させるとお互いのライブラリ内の同名のクラスでも(例: [scalaz版Monad](https://github.com/scalaz/scalaz/blob/9e2753d1/core/src/main/scala/scalaz/Monad.scala)、[cats版Monad](https://github.com/typelevel/cats/blob/1901bd4a/core/src/main/scala/cats/Monad.scala))型が非互換であるため混乱が起きやすいです。
なるべくcatsのみを使い、やむなく混在せざるを得ない場合はcats側に寄せることをおすすめします。

また[argonaut\-io/argonaut](https://github.com/argonaut-io/argonaut)と[circe/circe](https://github.com/circe/circe)などほぼ同じ目的のライブラリでScalaz版とCats版が存在するケースがありますが、上記の理由でなるべくCats版を使うことをおすすめします。

# 解説

## Scalaz

Scalazはscala上で関数型プログラミングをすることを支援するライブラリです。
[2008/11/30](https://github.com/scalaz/scalaz/graphs/contributors)にリポジトリが作られました。
各種モナドや便利な型クラスを導入してくれます[^1]。

## Cats

Catsもまたscala上で関数型プログラミングをすることを支援するライブラリです。
[2015/01/25](https://github.com/typelevel/cats/graphs/contributors)にリポジトリが作られました。
こちらもScalazとほぼ同じ概念を導入してくれます。

## Catsが生まれた背景(ScalazのCoC問題)

この2つは非常によく似ています。
以下のscaladocを見ればわかりますがクラスでも同名同機能のものや異名同機能のものが多数あります。

* [ScalazのScaladoc](https://static.javadoc.io/org.scalaz/scalaz_2.12/7.2.27/scalaz/index.html)
* [CatsのScaladoc](https://typelevel.org/cats/api/cats/index.html)

ではなぜCatsが生まれたかというと、Scalazで過去ある騒乱があったためです。

[OSSコミュニティがある日突然壊れたときにどうすればいいか - xuwei-k](http://xuwei-k.github.io/slides/oss-community/#1)

こちらが非常に詳しいのですが[^4]、簡単に説明すると

[^4]: というか当事者の記録ですね

1. scalazの初期からcontributeしている開発者の一人[Tony Morris\(@dibblego\)](https://twitter.com/dibblego)が粗暴な振る舞いをしていた[^2]
2. 我慢できなくなった他のscalaz開発者が彼をCoC(Code of Conducts)を使ってscalaz開発から追い出そうとした
3. 数ヶ月の論争の末、クーデターは失敗したがコミュニティに大きなダメージを残しScalazの評判も低下した
4. 上に嫌気が差した？人[^3]がscalaz代替であるcatsを作成した

という流れが2014~2015年ごろにあったようです。


## Catsを使うべき理由

### 1. CatsはScalazを元にいくつかの点で改善されている

型クラスの名前やクラスの継承関係などを見ればわかりますが、互換性や歴史的経緯によりScalazでは修正したいけどできない点をCatsは後発である利点を生かして修正しています。

* [scalaz/Monad\.scala · scalaz/scalaz](https://github.com/scalaz/scalaz/blob/9e2753d1/core/src/main/scala/scalaz/Monad.scala)
* [cats/Monad\.scala · typelevel/cats](https://github.com/typelevel/cats/blob/1901bd4a/core/src/main/scala/cats/Monad.scala)

pointメソッドではなくpureメソッドへ統一されていることなどがわかりやすいと思います。

### 2. Catsにリソース(物・ドキュメント・人)が流れている

CatsはScalazと比べて後発ですが、Maven Repositoryで見るとすでに[scalaz-core](https://mvnrepository.com/artifact/org.scalaz/scalaz-core)よりも[cats-core](https://mvnrepository.com/artifact/org.typelevel/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 トレンド](https://trends.google.co.jp/trends/explore?date=2009-01-01%202019-04-30&q=scala%20scalaz,scala%20cats)

あくまで個人的感覚ですがここ2年以内に作られたライブラリはscalazよりcatsに依存しているケースが多いです。

### 3. Scalaコンパイラ開発元の(実質的な)公式サポートライブラリからscalazが外れた

scalaの開発元(lightbend)は[scala/community-builds](https://github.com/scala/community-builds)というリポジトリでscalaの主要なライブラリとscalaのnightly-buildとの互換性をチェックしています。

そこにはScalazもCatsも含まれていたのですが、先日scalazが取り除かれました。

* [remove Scala\-CoC\-incompatible projects · scala/community\-builds@be8d3f0](https://github.com/scala/community-builds/commit/be8d3f07832c78044a65d3840a9338dc05943af7)

それに対する意見や説明などは次が詳しいです。

* [CoC\-compatible Community Builds \- Meta Discourse \- Scala Contributors](https://contributors.scala-lang.org/t/coc-compatible-community-builds/3097)
* [Taro L\. Saitoさんのツイート: "Scala Community Build、Airframeも参加しているのでメンテナの苦労がわかるけれど、メンテナがどれだけ各プロジェクトとのコミュニケーションで苦労しているか知った上でコメントしている人は少ない気がする。僕もこのスレッドを読んでようやく事情を理解した https://t\.co/ZR1BPUZbB7"](https://twitter.com/taroleo/status/1122896093937713153)
* [Kenji Yoshidaさんのツイート: "それ\( https://t\.co/8B35y81DST \)言うなら、中の人以外でここまで\( https://t\.co/QbEEVSzQ95 \)やってる人見たことないし\(z以外のライブラリ全てに対してやってる\)、Scalazが過去実際何度もScala自体のbug発見に役立ったことを知っているし、なんならその理由があるから"](https://twitter.com/xuwei_k/status/1122931342155456512)

建前と本音が入り混じり分かりづらいですが、結局のところ件のCoC問題が尾を引いているのだと思います。



[^3]: scalazでクーデターを起こしていた人とは別の人らしいです


[^2]: [怖いScala](http://xuwei-k.github.io/slides/kowai_scala/)の怖い発言の例がすべて件の人だったり、twitter覗くと「Scalaを書かなくていいとはなんと素晴らしい日なんだろう！」と発言していたり。もっとも後者はコミュニティを追い出された後ですが。

[^1]: [独習 Scalaz — 独習 Scalaz](http://eed3si9n.com/learning-scalaz/ja/)が詳しいです