This is what I put together for myself after reading the spec:
- Any method which takes a single parameter can be used as an infix operator:
a.m(b)
can be writtena m b
. - Any method which does not require a parameter can be used as a postfix operator:
a.m
can be writtena m
.
For instance a.##(b)
can be written a ## b
and a.!
can be written a!
- Postfix operators have lower precedence than infix operators, so
foo bar baz
meansfoo.bar(baz)
whilefoo bar baz bam
means(foo.bar(baz)).bam
andfoo bar baz bam bim
means(foo.bar(baz)).bam(bim)
. - Also given a parameterless method m of object a,
a.m.m
is valid buta m m
is not as it would parse asexp1 op exp2
.
Because there is a version of mkString
that takes a single parameter it will be seen as an infix opertor in fromFile(file) mkString map caesar(k)_
. There is also a version of mkString
that takes no parameter which can be used a as postfix operator:
scala> List(1,2) mkString
res1: String = 12
scala> List(1,2) mkString "a"
res2: String = 1a2
Sometime by adding dot in the right location, you can get the precedence you need, e.g. fromFile(file).mkString map { }
And all that precedence thing happens before typing and other phases, so even though list mkString map function
makes no sense as list.mkString(map).function
, this is how it will be parsed.