如果我正在编写库,我会习惯性地这样编写 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
不是if
类似情况,这让我想起了switch
C 人在接触 Java 时使用的语句。有趣的是,类似的实现Try
遵循我的 OOP 学校。所以我猜在Option
. 还有其他原因吗?