【问题标题】:Asymmetry of (Some (x), None).min and max(Some (x), None).min 和 max 的不对称性
【发布时间】:2016-04-22 18:20:14
【问题描述】:

意外地,我观察到了不对称性。

让我们列个清单:

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)

好的 - Some(9) 大于 None。为什么?大会? None 是否转换为 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

但我的问题仍然悬而未决:

是否None和Some(x),缺乏其他可比性,都视为Objects,然后通过toString比较('N'

【问题讨论】:

    标签: scala option


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 2012-08-26
      • 2023-03-19
      • 2020-08-20
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多