2013-10-04 51 views
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) 
       ^

这是一个简单的产品,从ab乘以数量的所有平方 包括的。

它说,有我的函数调用,但是,这应该是完全合法的,因为我通过一个lambda函数返回Int。任何有关这个问题的帮助和如何处理type mismatch错误将深表感谢。使用Scala 2.10.2

回答

3

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

+0

亲爱的主,它适用于repl,但不适用于工作表。在学习Scala时,该工作表是不是很好用? –

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) 

在其他情况下,斯卡拉REPL只看到这种函数的定义:

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

这不正确

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) 

为我工作。

相关问题