Scala-传递函数-类型混乱

Scala-传递函数-类型混乱,scala,functional-programming,Scala,Functional Programming,我在Scala IDE中有以下代码: type myF = () => Boolean def acceptFunction(f: myF) { //... } 然后: var a = false def isA = () => a 但当我尝试将其传递给acceptFunction时,会导致错误: acceptFunction(isA) 错误是: 类型失配;找到:()=>需要布尔值:布尔值 但是为什么呢 如果我这样声明isA: def isA() = () =>

我在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())
调用示例,但不会更改值。因此,问题的第二部分仍然存在——有没有办法通过这样一个函数进行进一步评估?

您确定第一次编写代码时没有出错?我复制并粘贴了您所拥有的内容到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>
更新:
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

这就是你想要去的地方吗?

这里也是,我也写了同样的答案。Scala版本2.9.1-1(Java HotSpot(TM)64位服务器虚拟机,Java 1.6.031)也是如此。嗯,真奇怪。似乎是Scala IDE的产物。这已经不是第一次了,似乎什么都没有。是的,它在REPL中也对我有效。但是,它总是生成一个闭包,因此在var中的变化对传递的函数没有影响。查看问题更新。我更新了我的答案,回答了更多的问题以回应您的更新。它在Scala IDE中工作得非常好。我将您的代码包装在一个
对象中
。如果我在调用站点添加空括号,它确实会失败,比如
acceptFunction(isA())
——这当然是正确的,因为当您应用该函数时,您会返回一个
布尔值
。当我尝试调用
acceptFunction(isA)时,我确实会收到您的错误