【问题标题】:Passing a specific type of function to another function将特定类型的函数传递给另一个函数
【发布时间】:2012-03-02 19:30:23
【问题描述】:

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

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

  • 类型不匹配;找到:() => 布尔值 => 所需单位:() => 布尔值 => 单位

我不明白为什么。我必须做什么才能让Reactive trait 存储一组布尔条件函数,如果它们的条件函数返回 true,这些函数应该稍后执行。也许我要绕道而行?有没有更简单的方法?

【问题讨论】:

  • 我相信 paulp 用括号消除了 2.10 上的类型。

标签: scala parameters functional-programming anonymous-function


【解决方案1】:

试着改写这个:

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

() =&gt; (is: Boolean) =&gt; activateDevice(0) 是一个没有参数的函数,它返回一个从BooleanUnit 的函数。 condition =&gt; activateDevice(0) 是一个具有单个参数的函数,称为 condition(其类型为 () =&gt; Boolean,已推断)并返回 Unit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2021-08-02
    相关资源
    最近更新 更多