2012年5月23日水曜日

Scalaz7

最近はgistでScalazワンライナー職人やってます。
ワンライナーになるのはScalazにアルゴリズムが揃ってるからですよ!と主張してみる。

Scalaz7


現在の最新リリース版はScalaz6系です。
githubのmasterも6系ですね。更新が1ヶ月前で止まってますが。

開発が活発に行われているブランチはscalaz-sevenです。
これは次期Scalazで、大幅な設計の見直しがされています。

主な違いは、
  • scalazのconcurrent,effect,iterateeパッケージがサブプロジェクトに分離されました。
    • httpとgeoはお亡くなりになりました・・・
  • 型クラスの階層構造が見直されました。
    • ZeroやEmptyがなくなったり、TraverseがFoldableを継承したり。
  • 型クラスのコンパニオンオブジェクトにインスタンスが定義されなくなりました。
    • インスタンスの定義は、scalaz.std以下や、各データ構造のコンパニオンオブジェクトに定義されるようになりました。
  • scalaz.syntax以下にimplicit conversionを使ったシンタックスが定義されるようになりました。
    • Identity,MA,MABなどない!
  • 新しいデータ構造が追加されました。
    • モナド変換子がいっぱいだよ! 
とまあこんな感じ。

Scalaz6と7では、パッケージ、データ構造、型クラス、メソッド名、かなり違います。
なので、6から7への移行は少し面倒かもしれません。

上記の違いはREADME参考にしながら書きましたが私的に重要だと思った変更を列挙していこうと思います。

Tag, Union


これだけでもにScalaz6から7へ移行する理由に成り得ます。
これらを使うことで適度に制約を加えられるようになり、設計がしやすくなります。
いままでNewTypeを使って実装していたものは全てTagで書き直されています。
あまり詳しく書いてないけれど、過去にちょっと書いた

scalaz.std


いままでは、*WにScalaの基本的なデータ構造の拡張が定義されていましたが、Scalaz7ではscalaz.std以下に型クラスのインスタンスと共に定義されています。
シンタックスも定義されていますが、高階関数に関数を渡すときなどに、直接関数を指定できるようになりました。

Sugarがない


Scalazのアイデンティティとも言える変態記号メソッドがなくなりました!
これを使ってScalazは変態だなんてもう言えなくなってしまうと思うと少し残念です。
いままで☆とか使ってた人はどうなるのでしょう・・・・・

まとめ


いまからScalazを使い始める人は、Scalaz7を使って欲しいかなあと思います。
変更が大きいということもありますが、Scalaz7の方が洗礼されてますし、より高機能になっているので、Scalazの凄さがよくわかるのではないかと思います。

Scalazを勉強したい方へ


自分の趣味のプロジェクトのコードにこの2行を加えましょう

import scalaz._
import Scalaz._




Scalaz勉強会とか需要があるのなら開こうと思うのだけれど、実際どうだろう?