Function application and types association

scala

Solution

Associativity (left or right), in general, is a predefined property of some notation (operator) which tells us how should we read expressions that use this notation multiple times in a chain.

For example, function application in Scala is an expression like `fun(param1, ...)`. It can be chained, for example: `fun(a,b)()(g,h)`. And the fact that it is left-associative means that such an expression is equivalent to `((fun(a,b))())(c,d)`, that is (in pseudocode):

( ( fun applied to arguments a and b ) applied to no arguments ) applied to arguments c and d

Function type in Scala is a type of function objects. Scala has its specific notation to denote such types. This notation uses `=>` operator. For example `String => Int` is a type of function that takes `String` as an argument and returns `Int`.

Now, the question arises, what is `String => Int => Float`? Is it a function that takes as an argument a function from `String` to `Int` and returns `Float`? Or maybe it's a function that takes `String` and returns a function from `Int` to `Float`?

In other words, should we read `String => Int => Float` as `(String => Int) => Float` or `String => (Int => Float)`? If `=>` operator was left-associative, then it would be `(String => Int) => Float`. If it was right-associative, it would be `String => (Int => Float)`.

As we know, `=>` is right-associative, which means that `String => Int => Float` is equivalent to `String => (Int => Float)` and it denotes type of a function that takes `String` and returns another function that takes `Int` and returns `Float`.

Problem

In Scala, function application associates to the left while function types associate to the right (scala course week two). I don't get this. Can anyone explain? What exactly is the difference between "function application" and "function type"?

Original source