0

我对 Scala 很陌生,但我相信我已经编写了一个完全合法的 Scala 程序:

这是在 Scala 工作表上:

  def product(f: Int => Int)(a: Int, b: Int): Int =
    if (a > b) 1 // Not a 0 because the unit value of product is a 1
    else f(a) * product(f)(a + 1, b)

  product(x => x * x)(3, 7)

但是,我收到以下错误:

> <console>:8: error: type mismatch;
   found   : Unit
   required: Int
           if (a > b) 1 // Not a 0 because the unit value of product is a 1 else f
  (a) * product(f)(a + 1, b)
           ^
> <console>:8: error: not found: value product
                product(x => x * x)(3, 7)
                ^

这是一个简单的乘积,将所有数字的平方a相乘b

它说我的函数调用有一些东西,但是,这应该是完全合法的,因为我正在传递一个确实返回一个Int. 任何有关此问题以及如何处理type mismatch错误的帮助将不胜感激。

使用 Scala 2.10.2

4

3 回答 3

3

工作表以某种方式将 of 的正文修改product为一行,因此该else子句不存在。您的代码在 repl 中编译并运行。

于 2013-10-04T19:04:58.743 回答
1

尝试在方法主体周围放置大括号:

def product(f: Int => Int)(a: Int, b: Int): Int = {
  if (a > b) 1
  else f(a) * product(f)(a + 1, b)
}
product(x => x * x)(3, 7)

为我工作。

于 2013-10-04T19:07:53.323 回答
0

如果你使用 repl,你应该将你的具体函数的主体括在大括号中,如下所示:

def product(f: Int => Int)(a: Int, b: Int): Int = {
    if (a > b) 1 // Not a 0 because the unit value of product is a 1
    else f(a) * product(f)(a + 1, b)
}

  product(x => x * x)(3, 7)

在其他情况下,scala repl 只能看到此类函数的定义:

def product(f: Int => Int)(a: Int, b: Int): Int = if (a > b) 1

这是不正确的

于 2013-10-04T19:07:10.937 回答