新しいScalazのApplicativeの構文を思いついた

Applicativeというより、正確にはApplyですが。まず、必要となる前提知識として、ScalazのApplicativeの書き方について説明。
(型推論の関係で)なぜか同じことするのに書き方が3種類(以上)あります。
あ、pab_techさんのスライドあるので、以下も参考にどうぞ。


http://hexx.github.io/applicative-style-in-scala/#1
https://github.com/hexx/applicative-style-in-scala

それぞれの利点欠点として

  • ^^ のスタイルは、型を省略できるが、ValidationやEitherなど、型パラメータ2のものでの推論が効かない
  • ApplicativeBuilderは、ValidationやEitherに対しても有効だが、 ^^ にくらべて、余計なオブジェクト生成コストがかかる。(自分はIDE使ってないので知らないが、聞いた話では、IDEでの推論が残念になるという欠点もあるらしい?)
  • Apply[Option].apply2 などと、直接型クラスのインスタンスを一旦取得してそれを使う方法は、最初に型を書かないといけない分だけ面倒
  • 余談として、shapelessを使う方法があるが、それだけのためにshapelessの依存増えるのもちょっと・・・
  • その他マクロで作ってる人もいるみたいだが、あまり実用されてるの聞かない

で、思いついたのは

https://github.com/xuwei-k/scalaz/compare/scalaz:7d4f5bd...xuwei-k:050250b

  • ^^ のスタイルと同じように、型は基本全く書かなくてよい
  • 余計なオブジェクト生成コストは・・・、Unapplyを大量に要求する分、ApplicativeBuilderと比べてどうなのかはよくわからない。(推論については ^^ より優れているのは確実なので) それに加えてApplicativeBuilderより優れている面もあるなら、どちらかの代替、もしくは併用として有用かもしれない?


scalazのMLに投稿したので
https://groups.google.com/d/msg/scalaz/b7JmfgEwSt8/Z34Dbs3ixswJ
他の人の意見待ちですが、賛成意見多ければ本体に入ったりするだろうか・・・。賛成意見どころか、全く反応ない(´・ω・`)

入らなかったとしても、もう少し考えてみて有用だと思ったら、単体で別ライブラリとして公開するかもしれない



追記:
ライブラリにして、publishした。scalaz7.0.x用と、7.1.0-M5両方で使えるように、(同じソースから)別々にビルドした。
https://github.com/xuwei-k/applybuilder
あと、scalaz本体と違い、22まで全部作っておいた