隐式排序[Option [T]]如何在Scala中工作?

国家恶魔

我在使用隐式分辨率,但想了解一下此隐式val有用吗?在订购中,我们有

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 }

我想知道什么时候隐式def Option [T](隐式ord:Ordering [T]):Ordering [Option [T]]有用或被调用。

我尝试了以下方法:

def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
  val e = implicitly(Ordering[Option[T]]).compare(value1, value2)
}

但是编译器不喜欢它。

找不到:类型T def test [Option [T]:Ordering](值1:Option [T],value2:Option [T])= {

如果我这样做,那理所当然可能只是为了方便

def test[Option[Int]: Ordering](value1: Option[Int], value2: Option[Int]) = {
  val e = implicitly(Ordering[Option[Int]]).compare(value1, value2)
}

I get 

type Option takes type parameters
def test[Option[Int]: Ordering](value1: Option[Int], value2: Option[Int]) = {
No implicit Ordering defined for Option[Int]

有人可以举一个例子,说明如何使用该隐式函数,或者它在实际中有用和有用的地方吗?

我的假设是,当需要Ordering [Option [T]]时,将调用此函数来解析隐式函数。但是我无法做到这一点....

编辑我写了以下更有意义的文章

def test(value1: Option[Int], value2: Option[Int]) = {
  val e = implicitly(Ordering[Option[Int]]).compare(value1, value2)
}

然后我不明白的是上下文绑定问题

def test[Option[T]: Ordering](value1: Option[T], value2: Option[T]) = {
  val e = implicitly(Ordering[Option[T]]).compare(value1, value2)
}

What's wrong with writing a context bound like that ?
马里奥·加里奇(Mario Galic)

我想知道什么时候隐式def Option [T](隐式ord:Ordering [T]):Ordering [Option [T]]有用或被调用。

隐式方法可用于从其他类型类实例中构造类型类实例,从而节省样板

implicit def Option[T](implicit ord: Ordering[T]): Ordering[Option[T]] =
  new OptionOrdering[T] { val optionOrdering = ord }

例如,给定类型类实例Ordering[Int],上述隐式方法可以构造类型类实例Ordering[Option[Int]](不要忘记该implicit参数,否则我们会隐式转换,这是令人讨厌的)。

[Option [T]:订购中有什么问题?

关键是要了解类型构造函数和适当类型之间的区别。例如Option,可以构造适当类型的类型构造函数Option[Int][Option[T]: Ordering]您定义中的type参数子句

def test[Option[T]: Ordering](value1: Option[T], value2: Option[T])

实际上没有指定Option类型构造函数。碰巧您用相同的名称命名,但是实际上指定的名称更像

def test[F[T]: Ordering](value1: F[T], value2: F[T])

此外,TF[T]实际上不能在方法的参数列表中使用,所以实际上你的定义更像是如此

def test[F[_]: Ordering](value1: F[T], value2: F[T])

现在错误应该更清楚了。F[_]: Ordering需要类型类实例Ordering[F],其中F是类型构造函数,但是没有这样的类型类实例,因为类型类的定义Ordering

trait Ordering[T]

哪里T是合适的类型。否则它将被定义为

trait Ordering[F[_]]

这样的类型类的一个例子是 Functor

trait Functor[F[_]]

因此,要在语法上修正您的定义,请尝试类似

def test[T](value1: Option[T], value2: Option[T])(implicit ev: Ordering[Option[T]]) = {
  ev.compare(value1, value2)
}

test(Some(1), Some(42))
// res0: Int = -1

implicitly[Ordering[Option[Int]]].compare(Some(1), Some(42))
// res1: Int = -1

test(Some(1), Some(42))相当于

test[Int](Some(1), Some(42))(Option[Int])
                                |
                         implicit method call

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章