我有此代码:
斯卡拉:
object C extends App{
def a(): Unit ={
println("a")
}
val b=a
}
f#:
let a=printfn "%A" "a"
[<EntryPoint>]
let main argv =
let b=a
0 // return an integer exit code
我只想将函数作为值a
传递,而不要运行它。为什么在运行程序时,将“ a”写入控制台?
答案 0 :(得分:3)
在Scala代码中,a()
是一种方法。因此,它不能作为参数传递或指定为值,但可以通过eta-expansion调整为函数,可以将 作为参数传递和/或分配为一个值。
val b = a _
答案 1 :(得分:2)
如果您希望a
是一个函数,则需要为其指定参数:
let a () = printfn "%A" "a"
然后在main
中调用它:
let main argv =
let b = a ()
0 // return an integer exit code
答案 2 :(得分:2)
加上jwvh的答案,可以通过将a
定义为函数而不是方法来更准确地表示F#代码的实质:
val a = () => println("a")
val b = a
这将按预期工作,不需要eta扩展。
答案 3 :(得分:0)
b
在到达您的代码行时被评估。
尝试使用lazy
代替。只会在您调用b
时计算它的值。
object C extends App{
def a(): Unit ={
println("a")
}
lazy val b = a // Nothing will happen here
b // Now "a" will be printed
}