我有以下功能可以正常工作:
def power(x: Double, n: Int) : Double = {
if (n > 0 && n % 2 == 0) power(x, n/2) * power(x, n/2)
else if (n > 0 && n % 2 == 1) x * power(x, n-1)
else if (n < 0) 1 / power(x, -n)
else 1
}
如果我将其更改为:
def power(x: Double, n: Int) : Double = {
if (n > 0 && n % 2 == 0) power(x, n/2) * power(x, n/2)
else if (n > 0 && n % 2 == 1) x * power(x, n-1)
else if (n < 0) 1 / power(x, -n)
else if (n==0 ) 1
}
即。将最终else
语句更改为else if
,然后尝试调用该函数时出现以下错误:
> <console>:8: error: not found: value power
power(2, 1)
^
我猜这是因为有一种可能的单位返回类型,因为n
的值不能满足任何条件?
答案 0 :(得分:7)
在Java中,“if-else”是一个声明。在Scala中,它是一个表达式(想想Java的三元组?:
),这意味着它总是产生一些价值。正如som-snytt在评论中提到的,如果缺少else
块,编译器会提供类型为else ()
的{{1}},这显然与预期类型{{1}冲突在你的例子中。
in Chris's answer提供了一些有效的Unit
错误示例。
答案 1 :(得分:2)
否 - 通常,if
表达式不需要else
子句。
示例:
if (true) println("a")
// prints "a"
if (false) println("a") else if (true) println("b")
// prints "b"
正如尼基塔·沃尔科夫的回答所说,如果你需要表达式除了Unit
之外还有其他类型,那就很有必要。
答案 2 :(得分:0)
你的猜测是正确的。该方法必须返回一个Double,如果非“if ..”情况匹配,则返回Unit。实际上,当你将第二个定义粘贴到repl中时,你应该得到
<console>:11: error: type mismatch;
found : Unit
required: Double