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