как использовать> <<=> = как функции? - PullRequest
6 голосов
/ 29 октября 2010

Мне нужно определить некоторые классы дел, например, следующие:

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

Мне не нравится повторять это для> <> = и <= </p>

я тоже пробовал это:

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 ]

6 голосов
/ 29 октября 2010

(a, b) => a > b работает отлично.Ваша проблема с типами.

  1. Какие V и E в evalute[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 не имеет смысла.

0 голосов
/ 29 октября 2010

В 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)
0 голосов
/ 29 октября 2010

Я не знаком со Scala, похоже, он поддерживает анонимные функции / lambdas: http://www.scala -lang.org / node / 133

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...