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
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
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
.