函数的打印结果

Print result of a function

如何在 Scala 中更改此函数,以便 运行 在 IntelliJ IDEA 上查看结果?

object poisson_sample_size extends App {

  def main(theta1: Double, theta2: Double): Double = {

    val theta1 = 0.0025
    val theta2 = 0.0030

    val num = 4
    val den = ((theta1 + theta2) / 2) - math.sqrt(theta1 * theta2)

    val x = num / den
    println(x: Double)
  }
}

我想看看结果是否符合我的预期。考虑到我刚开始学习 Scala,我不确定它是否能证明错误。

我试图将 (num / den) 的结果归因于一个变量,然后 print 变量本身,但它并没有达到我的预期。

如果我理解正确,要保持函数 main 的预期结果,您只需插入 x 作为函数的最后一个语句,它有一个隐含的 return 在 Scala 中的含义。

object poisson_sample_size extends App {

  def main(theta1: Double, theta2: Double): Double = {
    val num = 4
    val den = ((theta1 + theta2) / 2) - math.sqrt(theta1 * theta2)

    val x = num / den
    println(x: Double)
    x // same as: return x
  }

  val theta1 = 0.0025
  val theta2 = 0.0030
  main(theta1, theta2)
}

按照现在的方式,您应该得到一条编译错误消息,因为 println 具有 Unit return 类型,但您声明 main 具有 [=16] =] return类型。

请注意,当您扩展 App 时,您不必实施 main 方法。 object 的实际主体在应用程序 运行 时执行。请试试这个修改后的版本。

尝试将您的代码更改为如下内容:

object poisson_sample_size extends App {
  val t1 = 0.0025
  val t2 = 0.0030

  val result = calculate(t1, t2)
  println(result)

  def calculate(theta1: Double, theta2: Double): Double = {         
    val num = 4
    val den = ((theta1 + theta2) / 2) - math.sqrt(theta1 * theta2)

    num / den       
  }
}

通过使您的对象扩展 App,您可以免费获得一个 main 方法。然后,使用 main 对于您的自定义计算方法不是一个好主意,因为它会与真正的 main 方法混淆,所以我将其更改为 calculate。然后,您需要确保正在调用您的 calculate 方法,这可能是您在当前示例中看不到任何打印内容的真正原因。

开始Scala 2.13,链接操作tap可以这样使用:

import scala.util.chaining._

def f(): Int = calculate().tap(println)

避免这样的构造:

def f(): Int = {
  val x: Int = calculate()
  println(x)
  x
}

tap 链接操作在返回原始值时对值应用副作用(在本例中为 println):

def tap[U](f: (A) => U): A