Scala - 传递函数 - 类型混乱

时间:2012-04-11 14:27:22

标签: scala functional-programming

我在Scala-IDE中有以下代码:

type myF = () => Boolean

def acceptFunction(f: myF) {
  //...
}

然后:

var a = false

def isA = () => a

但是当我尝试将它传递给acceptFunction时,会导致错误:

acceptFunction(isA)

错误是:

  

类型不匹配;发现:()=>需要布尔值:布尔值

但为什么?

如果我这样声明isA

def isA() = () => a

然后它被接受,但我认为,由于括号,它得到了评估。

有没有办法通过这样的功能进行评估?

更新

看起来它与Scala-IDE有关。 REPL对这些表达没有任何问题。但是,我仍然无法使传递的函数不会变成闭包。我的意思是,它变成了闭包,稍后更改var a并再次使用println(f())调用示例 - 不会更改该值。所以,问题的第二部分仍然存在 - 有没有办法通过这样的功能进行评估?

1 个答案:

答案 0 :(得分:1)

您是否确定第一次编写代码时没有犯错?我将你所拥有的内容复制并粘贴到2.9.1 REPL中并且工作正常。

scala> type myF = () => Boolean
defined type alias myF

scala>  var a = false
a: Boolean = false

scala> def isA = () => a
isA: () => Boolean

scala> def acceptFunction(f: myF) {println(f())}
acceptFunction: (f: () => Boolean)Unit

scala> acceptFunction(isA)
false

scala>

UPDATE: isA是您定义时的闭包。将其传递给acceptFunction对于是否抓取a无效。

你的目的是编写一个函数acceptFunction,它接受​​一个函数f,它在定义时捕获外部值a吗?

你可以这样做:

// Defines a function which returns a function with returns the 
// value that was captured at the outer function's call time.
def isB = { (b: Boolean) => { () => b }: myF }

a = true

val f = isB(a)

acceptFunction(f) // >> true

a = false

acceptFunction(f) // >> true

那是你要去的地方吗?