Передача определенного типа функции в другую функцию - PullRequest
1 голос
/ 02 марта 2012

В Scala у меня есть следующая черта:

trait Reactive {

  type Condition = () => Boolean
  type Reaction = (Condition) => Unit

  var reactions = Map[Condition, Reaction]()

  def addReaction(c: Condition, r: Reaction) { reactions += (c -> r) }

  def addReactions(rs: List[Tuple2[Condition, Reaction]]) {
    for(r <- rs) r match { case(condition, reaction) => addReaction(condition, reaction) }
  }


  def updateReactive() {
    for(reaction <- reactions) reaction match {
      case (c, r) => r(c)
    }
  } 
}

, затем, когда я пытаюсь вызвать метод addReactions():

addReactions(List(
(() => UserInput.lastInput.isKeyHit('g'), () => (is: Boolean) => activateDevice(0))
))

, я получаю следующее сообщение об ошибке навторой аргумент кортежа:

  • несоответствие типов;найдено: () => Boolean => Требуется единица измерения: () => Boolean => Единица измерения

Я не понимаю, почему.Что мне нужно сделать, чтобы черта Reactive сохранила набор логически обусловленных функций, которые должны быть выполнены позже, если их функция условия возвращает true.Может быть, я иду в обход?Есть ли более простой подход?

1 Ответ

4 голосов
/ 02 марта 2012

Попробуйте написать это вместо:

addReactions(List(
  (() => UserInput.lastInput.isKeyHit('g'), condition => activateDevice(0))
))

() => (is: Boolean) => activateDevice(0) - это функция без параметров, которая возвращает функцию от Boolean до Unit. condition => activateDevice(0) - это функция с единственным параметром, который называется condition (тип которого () => Boolean, выводится) и возвращает Unit.

...