将特定类型的函数传递给另一个函数

时间:2012-03-02 11:15:07

标签: scala parameters functional-programming anonymous-function

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

我在元组的第二个参数上得到以下错误消息:

  
      
  • 类型不匹配;发现:()=&gt;布尔值=&gt;所需单位:()=&gt;布尔值=&gt;单元
  •   

我不明白为什么。如果Reactive特征存储了一组应该稍后执行的布尔条件函数,如果它们的条件函数返回true,我该怎么做呢?也许我会绕道而行?有没有更简单的方法?

1 个答案:

答案 0 :(得分:4)

请尝试改写:

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

() => (is: Boolean) => activateDevice(0)是一个没有参数的函数,可以将函数从Boolean返回到Unitcondition => activateDevice(0)是一个函数,其中包含一个名为condition的参数(其类型为() => Boolean),并返回Unit