Scalazの歴史と概要



クリエイティブ・コモンズ・ライセンス

話すこと

  • Scalazとは
  • 歴史やversion間の違い
  • モジュール構成
  • 自分とScalaz
  • なぜ使うべきか?いつ使うべきか?
  • Scalazを勉強する方法、そのための資料
  • コミッターの紹介
  • 関連ライブラリ紹介

Scalazとは?

|@| <*> <**> ^ *** &&& :-> <-: >>= ||| <<< >>> |=> <=| |> ?? |+| !&& --> | ? <^> !? :?>> <<?: :++> :++>> <++: <===> -+- =?= ⊛

超基本的な情報


読み方


  • すからぜっど ?
  • すからじぃー ?

どっちも聞いたことある気がする。まぁどうでもいい。“すからず” ではない、と思う

適当な要約

  • 2008年、Scalaを仕事でつかうことにしたけど、ゴミみたいなライブラリしかない
  • 同僚と、オープンソースで作ることに
  • 最初は内部的にscalaxという名前だった
  • しかし、scalaxという名前のライブラリは他に存在してた
  • 見てみたけど、それもまたゴミ
  • よって、scalazになった
  • (結局zの意味は語られていない・・・?)

githubには

“An extension to the core Scala library for functional programming”

It provides purely functional data structures to complement those from the Scala standard library. It defines a set of foundational type classes (e.g. Functor, Monad) and corresponding instances for a large number of data structures.

Scalaはオブジェクト指向と関数型を融合させた言語


だが

Scalazはそのオブジェクト指向部分を基本的に全否定して、Scalaにおける関数型プログラミングのみを追求

「関数型プログラミング」と一言でいっても、広いので、Scala標準ライブラリで足りない(もしくは使いづらい)部分は、基本的になんでも入っていて、結果大きくなる

歴史、versionの違いの詳細

大きく分けて以下

  • 6.x 系
  • 7.0.x 系
  • 7.1.x 系
  • 7.2.x 系

6 とそれ以前

6とそれ以前

  • Scala2.10までしか対応してない
  • そもそもgoogle codeな時代だったり
  • そもそもpull reqベースでの開発が主流でなかった時代
  • Scalaz7以降と、かなり異なる部分多い

6以前とそれ以降のコミット数比較

  • v6.0.4まで 1789 commit
  • v7.0.6まで 3642 commit
  • v7.1.0-RC1 4761 commit

6で消えたか変更されたもの

7.0.x 系

  • 2013年のScalaz (自分のblog)
  • 2013年4月22日に7.0.0finalリリース
  • それ以降、一部の例外を除いて、バイナリ互換性を維持してマイナーリリース(つまり1年以上続いてる)
  • 7.0.0 final 以降は、wikiにとても詳細にリリースノートまとまってる
  • https://github.com/scalaz/scalaz/wiki

7.0.x 系

  • 現在7.0.6が最新
  • 7.0.7も出す予定
  • Scala2.9.2 から 2.11 に対応
  • Scala2.11でのvarianceに関する変更とScalaz
  • Scala 2.12 対応は未定(簡単にできそうならやるかもしれないが、簡単にできないかもしれない)

6系と7.0.x以降の違い

  • importを分けられるようになった、MAやMABがなくなり、syntaxやOpsができた、という大きな設計変更
  • 半自動コード生成という謎技術
  • モジュール細かく別れた
  • その他数えきれないほど色々

7.1.x系

  • 7.0.0 finalが2013年4月にでたことにより、開発開始
  • Scala 2.9.3 から 2.11 に対応
  • Scala 2.12 対応は未定だが、7.0.xに比べればやりやすいはずなので、たぶんやる?
  • 7.1.0-M1からM7まで、7つのマイルストーンと、RC1

7.1.x系

  • もうすぐfinalがでるはず
  • 7.1.0 finalがでるまでは、バイナリ互換は保証されない
  • 基本的に、specs2などの7.0.x系に依存してるライブラリと共存できないので注意
  • 様々な機能追加はあるが、6から7の変更に比べれば、それなりに互換性ある

7.1.x系

  • 他のライブラリとの相性やバイナリ互換を考えて慎重を期すなら、まだ7.0.x使ったほうがいい
  • そのあたり気にする必要ない場合や、7.1.xにしか入ってない機能を使いたい場合は、もう7.1.0使うべき
  • バイナリ互換崩れないものは、7.0.xにバックポートされてる

7.0.xから7.1.xで、今のところバックポートされてない変更点(一部)

7.0.xから7.1.xで非推奨になったもの

7.0.xから7.1.xで、今のところバックポートされてない追加されたもの

  • InvariantFunctor, Align, Inject, ISet, Endomorphic, NotNothing, Scala標準ライブラリのFutureのインスタンス

7.2.x系

  • まだ開発始まってない
  • 7.1.0 の final が出れば開発開始
  • Scala2.9を切り捨てる予定
  • よって、value classやmacroを多用して、大きな改善が?
  • IOモナドとFutureをFreeモナドベースで統合?

モジュール構成

  • core
  • concurrent
  • effect
  • iteratee
  • iterv
  • scalacheck-binding
  • typelevel
  • xml
dependency-graph scalaz-scalacheck-binding scalaz-scalacheck-binding scalaz-iteratee scalaz-iteratee scalaz-scalacheck-binding->scalaz-iteratee scalaz-xml scalaz-xml scalaz-scalacheck-binding->scalaz-xml scalaz-typelevel scalaz-typelevel scalaz-scalacheck-binding->scalaz-typelevel scalaz-concurrent scalaz-concurrent scalaz-scalacheck-binding->scalaz-concurrent scalaz-core scalaz-core scalaz-scalacheck-binding->scalaz-core scalacheck scalacheck scalaz-scalacheck-binding->scalacheck scalaz-effect scalaz-effect scalaz-iteratee->scalaz-effect scalaz-xml->scalaz-core scalaz-typelevel->scalaz-core scalaz-concurrent->scalaz-effect scalaz-concurrent->scalaz-core scalaz-effect->scalaz-core

core

core

  • 一番利用者多いのも明らかにこれ(おそらく9割以上)
  • 単に“Scalaz“といった場合に、coreを指すこともあるくらい?
  • 基本的にこれを使いこなすことから始めて、他のモジュールは気にしなくてもよい、くらいに中身濃い

core

  • 大きすぎるのでモジュール分けたい話がでたが、(デメリット多すぎで)現実的じゃないという結論になり、大きいまま
  • 型クラスは @gakuzzzz さんが話してくれるはず
  • データ構造は @pocketberserker さんが話してくれるはず
class-diagram scalaz.Applicative scalaz.Applicative scalaz.Apply scalaz.Apply scalaz.Applicative->scalaz.Apply scalaz.ApplicativePlus scalaz.ApplicativePlus scalaz.ApplicativePlus->scalaz.Applicative scalaz.PlusEmpty scalaz.PlusEmpty scalaz.ApplicativePlus->scalaz.PlusEmpty scalaz.Functor scalaz.Functor scalaz.Apply->scalaz.Functor scalaz.Bind scalaz.Bind scalaz.Bind->scalaz.Apply scalaz.Cobind scalaz.Cobind scalaz.Cobind->scalaz.Functor scalaz.Comonad scalaz.Comonad scalaz.Comonad->scalaz.Cobind scalaz.ComonadStore scalaz.ComonadStore scalaz.ComonadStore->scalaz.Comonad scalaz.Foldable scalaz.Foldable scalaz.Foldable1 scalaz.Foldable1 scalaz.Foldable1->scalaz.Foldable scalaz.InvariantFunctor scalaz.InvariantFunctor scalaz.Functor->scalaz.InvariantFunctor scalaz.IsEmpty scalaz.IsEmpty scalaz.IsEmpty->scalaz.PlusEmpty scalaz.Monad scalaz.Monad scalaz.Monad->scalaz.Applicative scalaz.Monad->scalaz.Bind scalaz.MonadError scalaz.MonadError scalaz.MonadError->scalaz.Monad scalaz.MonadListen scalaz.MonadListen scalaz.MonadTell scalaz.MonadTell scalaz.MonadListen->scalaz.MonadTell scalaz.MonadPlus scalaz.MonadPlus scalaz.MonadPlus->scalaz.ApplicativePlus scalaz.MonadPlus->scalaz.Monad scalaz.MonadReader scalaz.MonadReader scalaz.MonadReader->scalaz.Monad scalaz.MonadState scalaz.MonadState scalaz.MonadState->scalaz.Monad scalaz.MonadTell->scalaz.Monad scalaz.Nondeterminism scalaz.Nondeterminism scalaz.Nondeterminism->scalaz.Monad scalaz.Plus scalaz.Plus scalaz.PlusEmpty->scalaz.Plus scalaz.Traverse scalaz.Traverse scalaz.Traverse->scalaz.Foldable scalaz.Traverse->scalaz.Functor scalaz.Traverse1 scalaz.Traverse1 scalaz.Traverse1->scalaz.Foldable1 scalaz.Traverse1->scalaz.Traverse
class-diagram scalaz.Arrow scalaz.Arrow scalaz.Category scalaz.Category scalaz.Arrow->scalaz.Category scalaz.Profunctor scalaz.Profunctor scalaz.Arrow->scalaz.Profunctor scalaz.Split scalaz.Split scalaz.Arrow->scalaz.Split scalaz.Bifoldable scalaz.Bifoldable scalaz.Bifunctor scalaz.Bifunctor scalaz.Bitraverse scalaz.Bitraverse scalaz.Bitraverse->scalaz.Bifoldable scalaz.Bitraverse->scalaz.Bifunctor scalaz.Compose scalaz.Compose scalaz.Category->scalaz.Compose scalaz.Choice scalaz.Choice scalaz.Choice->scalaz.Category scalaz.Enum scalaz.Enum scalaz.Order scalaz.Order scalaz.Enum->scalaz.Order scalaz.Equal scalaz.Equal scalaz.Order->scalaz.Equal scalaz.Split->scalaz.Compose

effect

concurrent

iterv

iteratee

iteratee

  • play2のiterateeよりジェネリックな感じ(play2はFuture固定)
  • それほど実用してるの見かけない
  • パフォーマンス出るのかどうかも謎?
  • メンテも、少し放置され気味

scalacheck-binding

typelevel

xml

自分とScalaz

  • 2013年6月からコミッター
  • 2013年のコミット数1位
  • 2014年もコミット数だと今のところ1位
  • (細かい変更が多いので)変更行数だと、総合5位くらい?
  • 総合のコミット数2位
  • https://github.com/scalaz/scalaz/graphs/contributors

Scalazコミッタになる方法

  • 無職になる
  • 暇なので、iPadにソースコード入れるなどして、ひたすらコードを隅々まで読む(現実逃避)
  • 細かいバグもしくは改善点見つかる
  • pull reqする
  • 繰り返し

Scalazコミッタになる方法

  • そのうちコミット権限貰える
  • ✌(‘ω‘✌ )三✌(‘ω’)✌三( ✌‘ω’)✌

なぜ使うべき?

いつ使うべきか?

いつ使うべきか?

  • Scala標準ライブラリでは(関数型プログラミングするのに)物足りないと感じたとき
  • チーム開発で使うなら、ある程度メンバーがついてこれそうなとき

使わない方がいいか、必ずしも使う必要ないとき

  • Scalaの基本的な言語仕様自体や、標準ライブラリの使い方もわかってない場合
  • Scala標準ライブラリで事足りるかどうかもわかってないとき
  • Optionに少し便利メソッドを追加する程度の使い方(今後それ以外の部分も使っていく予定ならともかく、本当にそれだけのために使うなら微妙)

初心者におおすすめなところ

勉強方法

  • コード読もう
  • Haskell勉強しよう?
  • 圏論はあったら役に立つかもしれないけど、必須じゃない(自分も圏論わかりません)
  • Functional Programming in Scala Scalazの本ではないが役に立つ
  • 独習Scalaz 網羅してるのはごく一部だったり、説明や例が簡素なことが多いので注意

主要なコミッタの紹介

@retronym

  • https://github.com/retronym
  • コミット数1位
  • Scalaのコミッターでもある
  • Scalaz7のプロトタイプを、ほぼ一人で作った
  • IntelliJ IDEAのScalaのプラグインもコミッタ

@tonymorris

@larsrh

  • https://github.com/larsrh
  • 最近のリリース関連全部やってる
  • wikiのリリースノートもほぼ全部書いてる
  • バイナリ互換の方針とか、開発方針とか中心になってすすめてくれてる

@S11001001

@runarorama

@pchiusano

@puffnfresh

@markhibberd

@pthariensflame

関連ライブラリ紹介

https://github.com/scodec/scodec

  • シリアライズ、デシリアライズ
  • scalaz-streamで使われている

https://github.com/scalaz/scalaz-stream

  • scalazコミッタの人が作ってる
  • iterateeなどの代替となるはずもの
  • 開発活発だし、パフォーマンス重視してて実用的?

https://github.com/julien-truffaut/Monocle

  • 別のLens実装
  • Scalaz本体にもLensあるのに・・・
  • 最近argonautがこれ使うようになった

https://github.com/puffnfresh/scala-lenz

  • 別のLens実装その2
  • みんななぜそんなにLensライブラリ作るのか

https://github.com/argonaut-io/argonaut

  • Jsonライブラリ
  • 一応、自分もコミッタ
  • それなりな速度でるらしいし、結構実用的かも?

https://github.com/etorreborre/specs2

  • みんな大好き(?) specs2
  • かなり有名なテストライブラリの一つ
  • 昔からscalaz6を内部に取り込んで使ってた
  • salaz 7.0.0 finalでたあとは、直接依存
  • よって現状 scalaz 7.1.x と混ぜて使えないので注意

https://github.com/milessabin/shapeless

  • scalazに依存してるわけではない!
  • 一部機能かぶってる(tagged type, Lens, HList など)
  • scalazよりある意味ヤバイ
  • https://github.com/typelevel/shapeless-contrib
  • akka-streamやplay2のanormのテストに使われ始めるなど、実用されてる

https://github.com/non/spire

  • scalazに依存してるわけではない!
  • これも一部機能かぶってる(Monoidなど)

https://github.com/runarorama/scala-machines

  • scalaz-streamと似たなにか
  • オワコンなのか、メンテされるのか謎

https://github.com/scalaz/scalaz-geo

  • 一度削除されたが、別リポジトリで復活した
  • 地理関係のなにか
  • あまり使ってる人多くないと思う

https://github.com/arjanblokzijl/scala-conduits

  • conduitsの移植
  • 全然メンテされてない

https://github.com/http4s/http4s

  • scalaz-stream使ってる
  • Scalatra3(まだ出てない)は、これ使うようになるらしい

https://github.com/scalatra/scalatra

  • commandsのモジュールでscalazが使われている

https://github.com/pthariensflame/scala-pipes

  • Haskellにpipesというライブラリがあるのだが、それの移植
  • あまりメンテされてない

https://github.com/xuwei-k/play2scalaz

  • 自作
  • play2とscalazの型クラスを相互変換するなど

https://github.com/xuwei-k/applybuilder

  • 自作その2
  • scalaz本体のApplyのsyntaxが12までしか使えなかったり、推論が残念なのを補うためのもの

https://github.com/xuwei-k/iarray

  • 自作その3
  • scalaz本体のImmutable Arrayが使いづらいので自作

おわり?質問タイム?