Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is everything a function or expression or object in scala?

Tags:

scala

I am confused.

I thought everything is expression because the statement returns a value. But I also heard that everything is an object in scala.

What is it in reality? Why did scala choose to do it one way or the other? What does that mean to a scala developer?

like image 397
user855 Avatar asked Apr 05 '12 03:04

user855


People also ask

Is everything an object in Scala?

Not everything is an object in Scala, though more things are objects in Scala than their analogues in Java. The advantage of objects is that they're bags of state which also have some behavior coupled with them. With the addition of polymorphism, objects give you ways of changing the implicit behavior and state.

Are functions objects in Scala?

All functions in Scala are special objects of type Function1 or Function2 or FunctionN, where N is the number of input arguments to the function. The compiler will box the function code we provide into the appropriate object automatically.

What are functions in Scala?

A Scala method is a part of a class which has a name, a signature, optionally some annotations, and some bytecode where as a function in Scala is a complete object which can be assigned to a variable. In other words, a function, which is defined as a member of some object, is called a method.

What are expressions in Scala?

2.2. In Scala, all statements are expressions that return a value. The value of the last statement determines the value of an expression. The if expression is no different — it always returns a value. So, we can assign the result of an if expression to a value.


3 Answers

I thought everything is expression because the statement returns a value.

There are things that don't have values, but for the most part, this is correct. That means that we can basically drop the distinction between "statement" and "expression" in Scala.

The term "returns a value" is not quite fitting, however. We say everything "evaluates" to a value.

But I also heard that everything is an object in scala.

That doesn't contradict the previous statement at all :) It just means that every possible value is an object (so every expression evaluates to an object). By the way, functions, as first-class citizens in Scala, are objects, too.

Why did scala choose to do it one way or the other?

It has to be noted that this is in fact a generalization of the Java way, where statements and expressions are distinct things and not everything is an object. You can translate every piece of Java code to Scala without a lot of adaptions, but not the other way round. So this design decision makes Scala is in fact more powerful in terms of conciseness and expressiveness.

What does that mean to a scala developer?

It means, for example, that:

  • You often don't need return, because you can just put the return value as the last expression in a method
  • You can exploit the fact that if and case are expressions to make your code shorter

An example would be:

def mymethod(x: Int) = if (x > 2) "yay!" else "too low!"

// ...
println(mymethod(10))  // => prints "yay!"
println(mymethod(0))   // => prints "too low!"

We can also assign the value of such a compound expression to a variable:

val str = value match {
            case Some(x) => "Result: " + x
            case None    => "Error!"
          }
like image 72
Niklas B. Avatar answered Oct 12 '22 23:10

Niklas B.


The distinction here is that the assertion "everything is a expression" is being made about blocks of code, whereas "everything is an object" is being made about the values in your program.


Blocks of Code

In the Java language, there are both expressions and statements. That is, any "block" of code is either an expression or a statement;

//the if-else-block is a statement whilst (x == 4) is an expression
if (x == 4) {
    foo();
}
else {
    bar();
}

Expressions have a type; statements do not; statements are invoked purely for their side-effects.

In scala, every block of code is an expression; that is, it has a type:

if (x == 4) foo else bar //has the type lub of foo and bar

This is extremely important! I cannot stress this enough; it's one of the things which makes scala a pleasure to work with because I can assign a value to an expression.

val x = if (x == 4) foo else bar

Values

By value, I mean something that we might reference in the program:

int i = foo(); //i is a reference to a value
java.util.TimeUnit.SECONDS;

In Java, the i above is not an object - it is a primitive. Furthermore I can access the field SECONDS of TimeUnit, but TimeUnit is not an object either; it is a static (for want of a better phrase). In scala:

val j = 4
Map.empty

As far as the language is concerned, j is an object (and I may dispatch methods to it), as is Map - the module (or companion object) for the type scala.collection.immutable.Map.

like image 28
oxbow_lakes Avatar answered Oct 12 '22 23:10

oxbow_lakes


Is everything a function or expression or object in scala?

None of it.

There are things that are not objects. e.g. classes, methods.

There are things that are not expressions. e.g. class Foo { } is a statement, and does not evaluate to any value. (This is basically the same point as above.)

There are things that are not functions. I don't need to mention any examples for this one as there would be plenty in sight in any Scala code.

In other words, "Everything is a X" is nothing more than a sales pitch (in case of Scala).

like image 23
missingfaktor Avatar answered Oct 12 '22 23:10

missingfaktor