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

时间:2010-10-29 03:14:50

标签: scala

我需要定义一些类似下面的案例类:

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))
  }
}

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

我也尝试过这个:

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))
  }
}

但是没有用:(

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))

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

3 个答案:

答案 0 :(得分:6)

(a, b) => a > b运行正常。你的问题在于类型。

  1. V中的Eevalute[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没有意义。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在Scala中,这些不是运算符,而是方法。您可以通过在其后面添加下划线将任何方法提升为函数。例如

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f: (Int => Boolean) = 1 <= _
f: (Int) => Boolean = <function1>

scala> (0 to 2).map(f)
res0: scala.collection.immutable.IndexedSeq[Boolean] = Vector(false, true, true)