I am learning scala and can't understand why:
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else 0
}
Has Int
as return type signum (arg: Int): Int
But
def signum(arg: Int) = {
if(arg > 0 ) 1
else if(arg < 0) -1
else if(arg == 0) 0
}
Has AnyVal
signum (arg: Int): AnyVal
if (cond) { expr } returns common base type of Unit and type of expr , just like if (cond) { expr } else { () } . Show activity on this post. As always, an if statement evaluates a logical condition and has to return a logical result.
When a return statement is used in a function body, the execution of the function is stopped. If specified, a given value is returned to the function caller. For example, the following function returns the square of its argument, x , where x is a number. If the value is omitted, undefined is returned instead.
Use the IF function, one of the logical functions, to return one value if a condition is true and another value if it's false. For example: =IF(A2>B2,"Over Budget","OK") =IF(A2=B2,B4-A4,"")
It happens because in the second case you have not specified final else
part. In this case the return type of this missing branch would be Unit
. So Scala compiler infers AnyVal
as a common parent of Int
and Unit
.
you can try to add explicit return type to the function signature:
def signum(arg: Int): Int = ...
It will not compile with following error:
found : Unit
required: Int
else if(arg == 0) 0
^
one error found
So the compiler tells you that result type of the last if
is actually Unit
and not Int
.
In the absence of an explicit else
, Scala assumes this:
else ()
Where ()
is the value of Unit
. It's the value returned by println
or assignment to var
, for example.
This can be easily verified:
scala> val x = if (false) 1
x: AnyVal = ()
scala> x.isInstanceOf[Unit]
res3: Boolean = true
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With