2012年12月18日火曜日

Scalazのかきかた


というわけで、Scalaz Advent Calendarの18日目の記事です。

Scalazには多くの型クラスとそのインスタンスが定義されており、それを扱うために、多くの記法が存在します。
この記事では簡単で冗長な記法から、複雑で簡素な記法まで紹介していきます。

インスタンスの取得


implicit valueとして定義されている型クラスのインスタンスは、implicit parameterにより取得が可能です。

そのインスタンスの取得にも様々方法があります。

implicitly

Scala標準ライブラリに定義されている、implicit valueを取得する関数です。


TypeClass

また、Scalazの型クラスにはインスタンスの取得のための関数、TypeClass.applyを使用することができます。


関数呼び出し


ある型クラスの関数を使用するとき、先ほどのようにインスタンスから直接呼び出すことができます。


Ops

しかし、明示的に型クラスのインスタンスを取得するのは冗長です。
Scalazではimplicit conversionを用いて、型クラスのインスタンスをもつオブジェクトに対して暗黙の型変換を提供します。


暗黙型変換の他にも、単一のオブジェクトを対象としない型クラスの関数がインポートされます。


関数定義


関数を定義するとき、implicit parameterを指定する方法が2つあります。

implicit

1つはimplicitを使う方法です。


Context Bounds

もう1つ、Context Boundsというものが存在します。


インスタンスを明示的に扱わない場合はContex Boundsで定義した方が良いでしょう。


Syntax


大抵の場合の場合はOpsとContex Boundsで短いコードが得られますが、これらを使っても冗長になる場合があります。


Scalaでは返り値の型を指定してもimplicit valueを決定することは出来ないので明示的に型を書く必要があります。
このような場合、Syntaxを使うことで明示的に型を指定する必要がなくなります。


まとめ


短く簡素なコードになるほど、複雑な仕組みが使われていきます。
大抵のものはContex BoundsとOpsで短いコードになるので、積極的に使っていきましょう。
型クラスのインスタンスから直接関数を呼ぶのも良いですが、Syntaxをimportした方が簡素になる場合があることも頭に入れておくと良いでしょう。

0 件のコメント:

コメントを投稿