Ordering[A] がある場合、Scala は実際に Option[A] の Ordering を作成できますが、セマンティクスは必要なものとは異なります (None が最小値です)。
また、比較が機能するには、両方の値が同じ型である必要があるため、Ints を Option に持ち上げる方法が必要です。そのために opt メソッドを追加しました。
これは、内部順序付けの例です。
import scala.math.Ordering.Implicits.infixOrderingOps
//This allows you to use method/operator syntax on anything with an Ordering
implicit def mkOption[A](a: A) = new { def opt: Option[A] = Some(a) }
var o1 = Some(1)
var o2: Option[Int] = None
var x = 2
val test1 = x < 3 && o1<5.opt //=> true
val test2 = x < 3 && o2<5.opt //=> true
val test3 = x < 3 || o2<5.opt //=> true
None > 0.opt //=> false
None < 0.opt //=> true
セマンティクスに近づくために、新しい順序を定義できます
implicit def mkOptionOrdering[A: Ordering] = new Ordering[Option[A]] {
def compare(a: Option[A], b: Option[A]): Int = {
if (a.isEmpty || b.isEmpty) 0
else implicitly[Ordering[A]].compare(a.get, b.get)
}
}
これで、テストは期待どおりに機能し、2 つの追加のテストも false になりますが、これらのセマンティクスはかなり奇妙です。compare は、等しくないものに対して 0 を返します。