尝试将函数传递给值,但函数运行

时间:2019-06-12 07:21:32

标签: scala f#

我有此代码:

斯卡拉:

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”写入控制台?

4 个答案:

答案 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
}