(一些(x),无).min和max的不对称性

时间:2016-01-17 15:38:13

标签: scala option

无意中,我观察到了不对称。

我们有一个清单:

val li = List (Some (3), Some (2), None, Some (9)) 
li: List[Option[Int]] = List(Some(3), Some(2), None, Some(9))

scala> li.max
res54: Option[Int] = Some(9)

好的 - 有些(9)大于无。为什么?会议?没有转换为Null和Null自动装箱成0吗?

scala> li.min
res55: Option[Int] = None

看起来,好像这种印象是真的,但让我们引入一个负数:

scala> val li = List (Some (3), Some (-2), None, Some (9)) 
li: List[Option[Int]] = List(Some(3), Some(-2), None, Some(9))

scala> li.min
res52: Option[Int] = None

scala> li.max
res53: Option[Int] = Some(9)

这令人惊讶,至少对我而言。

是的,我知道,我做错了。正确的方法是首先压扁,一切都很好:

scala> li.flatten.min
res57: Int = -2

scala> val li = List (Some (3), Some (2), None, Some (9)) 
li: List[Option[Int]] = List(Some(3), Some(2), None, Some(9))

scala> li.flatten.min
res56: Int = 2

但我的问题仍然存在:

是否和一些(x)缺乏其他可比性,被视为对象,然后通过toString进行比较(' N'' S')?

1 个答案:

答案 0 :(得分:9)

查看source

  trait OptionOrdering[T] extends Ordering[Option[T]] {
    def optionOrdering: Ordering[T]
    def compare(x: Option[T], y: Option[T]) = (x, y) match {
      case (None, None)       => 0
      case (None, _)          => -1
      case (_, None)          => 1
      case (Some(x), Some(y)) => optionOrdering.compare(x, y)
    }
  }
  implicit def Option[T](implicit ord: Ordering[T]): Ordering[Option[T]] =
    new OptionOrdering[T] { val optionOrdering = ord }

Some(x) 始终视为大于None。没有尝试将None视为零或其他任何内容。因此,对于任何Option[A](假设所述集合包含A),它始终是None集合的最小值。没有不对称性,这只是惯例。我认为尝试将None转换为任意数字进行比较并不合理,因此None小于Some(x)每个Ordering[Option[A]]都有意义。否则,对于每个Ordering[A],您需要一个特殊的<<TreeviewSelect>>来处理这些特殊情况,而不是上面的通用代码。