2017-03-29 28 views
-4

当写一个递归函数计算两个通用函数f1和f2相等的点数(假设只有整数值)时,我得到了这个问题。标识符预期但发现整数立即数

object X1 { 
    def numEqual(f1:Int=>Int,f2:Int=>Int)(a:Int,b:Int):Int= 
    if(a>b) 0 
    else f1(a)==f2(a) ? 1+numEqual(f1,f2)(a+1,b):0+numEqual(f1,f2)(a+1,b) 

而这正是编译器说:

X1.scala:5: error: identifier expected but integer literal found. f1(a)==f2(a) ? 1+numEqual(f1,f2)(a+1,b) : 0+numEqual(f1,f2)(a+1,b) ^ one error found.

谢谢!

+0

我不明白为什么downvotes。这个问题(和答案)帮助了我很多。 –

回答

4

if构建体在Scala是一个表达式。正如其他人已经说过的,没有三元运营商,因为不需要它 - 如果已经是表达式。

我重写你的函数尾递归版本(避免StackOverflowError S),让我们来看看它的样子:

@tailrec def numEqual(f1: Int => Int, f2: Int => Int)(a: Int, b: Int, res: Int = 0): Int = 
    if (a > b) res 
    else { 
    val inc = if (f1(a) == f2(a)) 1 else 0 
    numEqual(f1, f2)(a + 1, b, res + inc) 
    } 

注意如何,如果表达式的结果分配给inc - 在这里你会通常使用三元运算符。无论如何,我希望这可以帮助你。

1

? :操作者不存在阶