如何使用> << => =作为函数?

spa*_*gon 6 scala

我需要定义一些case类,如下所示:

case class Gt(key: String, value: Any) extends Expression {
  def evalute[V, E](f: String => Any) = {
    def compare(v: Any): Boolean = {
      v match {
        case x: Number => x.doubleValue > value.asInstanceOf[Number].doubleValue
        case x: Array[_] => x.forall(a => compare(a))
        case x => x.toString > value.toString
      }
    }
    compare(f(key))
  }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢重复> <> =和<=

我也试过这个:

trait Expression {
  def evalute[V, E](f: String => Any) = true

  def compare(v: Any, value: Any, cp: (Ordered[_], Ordered[_]) => Boolean): Boolean = {
    v match {
      case x: Number => cp(x.doubleValue, value.asInstanceOf[Number].doubleValue)
      case x: Array[_] => x.forall(a => compare(a, value, cp))
      case x => cp(x.toString, value.toString)
    }
  }
}
case class Gt(key: String, value: Any) extends Expression {
  def evalute[V, E](f: String => Any) = {
    compare(f(key), value, ((a, b) => a > b))
  }
}
Run Code Online (Sandbox Code Playgroud)

但那不工作:(

error: could not find implicit value for parameter ord: scala.math.Ordering[scala.math.Ordered[_ >: _$1 with _$2]]
compare(f(key), value, ((a, b) => a > b))
Run Code Online (Sandbox Code Playgroud)

有没有办法将运算符作为scala中的函数传递?

Ale*_*nov 6

(a, b) => a > b工作良好.你的问题与类型有关.

  1. 什么是VEevalute[V, E]应该是什么?

  2. 您将其(a, b) => a > b作为参数传递cp: (Ordered[_], Ordered[_]) => Boolean.所以你有a: Ordered[_]b: Ordered[_].这是一样的a: Ordered[X] forSome {type X}b: Ordered[Y] forSome {type Y}.有了这些类型,a > b没有意义.


Mar*_*ine 0

我不熟悉 Scala,它似乎支持匿名函数/lambda:http://www.scala-lang.org/node/133