2012年8月28日火曜日

Scala Tips / Option(16) - First, Last, Max, Min その2

OptionのTagの使用方法に抜けがあったので追加情報です。

ねこはるさんから情報をいただきました。ありがとうございます。

Tags.First

Tags.Firstのタグ付けの方法です。

前回の記事では、Tagメソッド(scalaz.Tagのapplyメソッド)を用いる以下の2つの方法を紹介しました。いずれも型を正確に指定しないといけないので使い方はやや煩雑です。

val a: Option[Int] @@ Tags.First = Tag(1.some)
val b: Option[Int] @@ Tags.First = Tag(2.some)
val c: Option[Int] @@ Tags.First = Tag(3.some)
val n: Option[Int] @@ Tags.First = Tag(none)
val a = Tag[Option[Int], Tags.First](1.some)
val b = Tag[Option[Int], Tags.First](2.some)
val c = Tag[Option[Int], Tags.First](3.some)
val n = Tag[Option[Int], Tags.First](none)

実はTags.Firstの指定は以下の方法で可能です。

val a = Tags.First(1.some)
val b = Tags.First(2.some)
val c = Tags.First(3.some)
val n = Tags.First(none[Int])

この方法だとOption[Int]に関する型情報を陽に指定しなくても自動的に判別してくれます。

Tags.Firstメソッドは実装にTagメソッドを使っています。Tagメソッドは、Tags.Firstメソッドのようなメソッドを実装するためのユーティリティ・メソッドとして考えるとよさそうです。

Tags.Last

Tags.Lastのタグ付けは以下になります。

val a = Tags.Last(1.some)
val b = Tags.Last(2.some)
val c = Tags.Last(3.some)
val n = Tags.Last(none[Int])

Tags.Max

Tags.Maxのタグ付けは以下になります。

val a = Tags.Max(1.some)
val b = Tags.Max(2.some)
val c = Tags.Max(3.some)
val n = Tags.Max(none[Int])

Tags.Min

Tags.Minのタグ付けは以下になります。

val a = Tags.Min(1.some)
val b = Tags.Min(2.some)
val c = Tags.Min(3.some)
val n = Tags.Min(none[Int])

ノート

いわずもがなですが、各Tagはstatic importすると短い名前で使用することができます。

import Tags._

val a = First(1.some)
val b = First(2.some)
val c = First(3.some)
val n = First(none[Int])

static importをやり過ぎるとプログラムの可読性が落ちてしまうので、ボクのマイルールでは一度や二度出てくる程度の場合はTags.Firstのようにqualified nameで書くようにしています。Emacs +ensimeだと、ensimeによるオブジェクト名やメソッド名の補完に加えてEmacsの基本機能であるdynamic abbreviationがあるのでqualified nameを書くのも(比較的)苦になりません。

諸元

  • Scala 2.10.0-M6
  • Scalaz 7.0.0-M2

0 件のコメント:

コメントを投稿