私がライブラリを書いていたら、私は習慣的に Option を次のように書いていました:
abstract class Option[+A] {
def map[B](f: A => B): Option[B]
}
case object None extends Option[Nothing] {
override def map[B](f: Nothing => B): Option[B] = None
}
case class Some[+A](a: A) extends Option[A] {
override def map[B](f: A => B): Option[B] = new Some(f(a))
}
map
実装にポリモーフィズムを使用していることに注意してください。ただし、 map の実際の実装は完全に Option クラスにあり、次のようになります。
def map[B](f: A => B): Option[B] =
if (isEmpty) None else Some(f(this.get))
私の実装はよりクリーンで (ポリモーフィズムの利点を参照してください)、おそらくより高速であると主張します。同様のケースではなく、Either
型の一致が使用されます。C の人々が Java に来るときに使用するステートメントを思い出します。興味深いことに、類似の実装は私の OOP 流派に従っています。したがって、より短いソリューションが で選択されたと思います。他の理由はありますか?if
switch
Try
Option