Scalaz の命名規則

この記事は Scalaz Advent Calendar 2012 の4日目です。

どこかで Scalaz7 の package や class/trait の命名規則について書いてというのを見た気がするのでその辺を書いてみようと思います。

ちなみにあくまで現状のソースコードを見た上での推測で、MLなり何なりで裏取った情報ではない事を先に明記しておきます。内容に誤りなどありましたらぜひぜひご指摘ください。

Suffix無し

主に scalaz パッケージ直下にある、Suffix のついていないクラス/トレイトは大きく分けて2種類に分類されます。

一つが Scalaz が提供する型クラス。Functor とか Foldable とかそういったモノですね。あくまで型クラスの定義であって、型クラスのインスタンスではありません。

もう一つが Scalaz が提供するデータ構造。Validation とか InsertionMap とかですね。余談ですが InsertionMap なかなか興味深いですね。^-^ メソッド とか味わい深いです。

HogeInstances

そして、Suffix に Instances とついているものが、そのデータ構造に対する型クラスインスタンス郡を提供するトレイトになります。 OptionInstances が Option に関する色々な型クラスのインスタンスを提供している感じですね。

この HogeInstances がトレイトになっているのは、importを細かく制御できるように、package object だったり個別の object だったりと複数の object に mixin できるようにするためと思われます。

HogeFunctions

Suffix に Functions がついているものは、そのデータ構造に関するグローバル関数的なものを提供するトレイトです。none[String] で Option[String] 型の None が取得できるのは OptionFunctions が none メソッド を提供しているからですね。

これも import範囲を制御できるようにトレイトとして定義され、複数のオブジェクトに mixin されています。

HogeOps

Suffix に Ops がついているものは、そのデータ構造あるいは型クラスインスタンスに、便利メソッドを提供したりなどの拡張を行うラッパーです。基本的にはimplicit conversionによって変換されるだけで明示的に HogeOps型に対して操作を行う事は無いでしょう。Option#getOrElse を | と書けるようになるのは OptionOps のおかげですね。

HogeSyntax

Suffix に Syntax がついているものは、その型クラスに対して、便利メソッドや省略記法を提供するものです。何も考えずに型クラスを大量につかってカタカタするとソースコード上の型表現が大変になってしまうので、なるべく Scalaz のユーザが明示的に型を書かなくても済むようにする働きがあるそうです。
正直Syntaxに関しては理解が曖昧なので識者に補足して頂けることを期待しております;-p

HogeLaw (2012-12-10 23:54 追記)

一つ重要なものを忘れていました。Scalazが提供する型クラスには、Suffix に Law がつくトレイトを提供しているものがあります。FunctorLawMonadLaw といったものですね。これらのトレイトは何を表しているかというと、その型クラスインスタンスが満たすべき法則が定義されています。

これらの法則は戻り値として Boolean を返すメソッドとして記述されていて、テストにて其々の型クラスインスタンスがその法則を満たしているかチェックを行っています。例えば、MonadLaw であれば ScalaCheck にて其々の law をまとめた laws が定義され、EitherTest 内で Either が MonadLaw を満たすかチェックしています。

(追記ここまで)

package 分け

package については、大きく分けて以下の4つの様になっています。

  • scalaz パッケージ直下に、Scalaz が提供する型クラスとデータ構造およびそのデータ構造の型クラスインスタンスが収められています。
  • scalaz.std パッケージ以下に Scala/Java の標準ライブラリにあるデータ構造に対する型クラスインスタンスが収められています。
  • scalaz.syntax パッケージ直下には、Scalaz が提供するデータ構造と型クラスに対する Ops/Syntax が収められています。
  • scalaz.syntax.std パッケージ以下 には、Scala/Java の標準ライブラリにあるデータ構造に対する Ops/Syntax が収められています。

まとめ

以上が簡単な Scalaz の命名規則になります。自分で型クラスを提供するようなライブラリを作成している場合に、型クラスインスタンスの置き場など参考になるのではないでしょうか。また、implicit のスコープを制御するために import しやすい形式になっているのは中々便利だと思います。この辺も自作ライブラリで参考にできるかと思います。

おしまい。

2012-12-18 00:45 追記

HogeSyntax について、さっそく識者の方々が補足してくれました!

  1. Scalaz の Syntax という仕組みの解説 @xuwei さん
  2. Scalazのかきかた @halcat0x15a さん