2012年10月29日月曜日

Scala Tips / Option(17) - orEmpty, orZero

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

1 件のコメント: