Scalaプログラミングの要諦はOptionにあり、と常々感じるわけですが、Scalazを使うとさらにOptionが便利になります。
先日は以下の様なワンライナーが決まり、ガッツポーズがでました。(?)
target.orEmpty[List] ::: ~deps
targetはOption[T]型、depsはOption[List[T]]型です。
基本的には、targetの内容のTとdepsの内容のList[T]をconsで接続して一つのListにしたいわけですが、targetとdepsのそれぞれがOption型でどちらもNoneである可能性があるのが厄介です。
Java的なコーディングで普通に書くと、targetがSomeとNoneの2通り、depsがSomeとNoneの2通りの組合せで、4通りの組合せに対してifやmatchを用いた分岐を用いることになりそうです。
これは結構煩雑な処理になりますが、orEmptyメソッドとorZeroメソッド(またはunary_〜メソッド)を用いると上記のように完結に記述することができるわけです。
orEmptyメソッド
OptionのorEmptyメソッドは以下の処理を行います。
- OptionがSomeの場合、Someの内容を型パラメタで指定したコンテナに格納して返す
- OptionがNoneの場合、型Tの零元を型パラメタで指定したコンテナに格納して返す
ポイントになるのは以下の2点です。
- 型パラメタで指定したコンテナを自動的に生成
- Noneの場合は型Tの零元を自動的に生成
この2つの処理を型情報に従って自動的に行なってくれるので、プログラミングを大幅に省略できるわけです。
プログラムに登場する「target.orEmpty[List]」はtargetがSome[Int]ならSomeの中に入っている数値を入れたList[Int]を、NoneならList(0)を返します。
orZeroメソッド(unary_〜メソッド)
Optionのunary_〜メソッドはorZeroメソッドと同じものです。
OptionのorZeroメソッドは以下の処理を行います。
- OptionがSomeの場合、Someの内容を返す
- OptionがNoneの場合、型Tの零元返す
こちらも以下の点がポイントです。
- Noneの場合は型Tの零元を自動的に生成
ノート
零元を自動生成するというのはわりと重要な機能で、Scalazの型クラスZeroによって実現しています。Monoidの便利さも零元(単位元)によるところが大きいことは言うまでもありません。
Scalazを用いると、こういった形で処理を完結に書けるのがよいですね。
ScalazはMonoidやTraverseのような大物もよいのですが、OptionWやBooleanWといった小粒の機能がなかなか便利なのもよいところです。
諸元
- Scala 2.10.0-RC1
- Scalaz 2.10.0-M6
scalaz の version 表記が間違ってませんか?
返信削除