SlideShare a Scribd company logo
What Can Scala Puzzlers
Teach Us?
Daniel C. Sobral
Disclaimer #1: "Puzzlers"
● Java Puzzlers (the book/presentations):
○ Weird behavior in Java that is difficult to predict or
explain
● This presentation:
○ Weird behavior in Scala that confounds beginners
■ (and sometimes experienced programmers)
○ FAQs, not Fun
I can't speak for any of the people who
contributed to create and turn Scala into what it
is. Furthermore, if you learn anything from this
presentation, learn that a perfect understanding
of Scala is an unlikely achievement...
Disclaimer #2: don't trust me.
Symbols, operators and punctuation
● What does it mean?
● Where can I find information about it?
● WTF?
The symbol puzzler
Source: Stack Overflow
The Origin of the Symbols
● Punctuation elements of the language
○ @ # ( ) [ ] { } , . ; : ` ' "
● Keywords, reserved symbols and XML
○ <- => <: >: <% // /* */ _* <? <!
● Normal definitions from libraries
○ <:< =:= ☆ ★ η :/
● Underscore
○ All of the above!
Symbols may be part of the language or come
from external libraries; it can be difficult to tell
where they begin and end; they are difficult to
search for on the Internet, non-mnemonic and
unpronounceable.
Then why?
def f(xs: Array[Int], a: Int, b: Int) =
for (i <- xs.indices)
xs(i) = a * i + b
So that libraries can extend the
language seamlessly
def f(xs: M[T], a: T, b: T) =
for (i <- xs.indices)
xs(i) = a * i + b
For M and T library-types that support these
operations
Which still doesn't really justify unicode...
Advice regarding Symbols
● Learn the language:
○ What symbols are "built-in"
○ The syntax rules
● If exploring code using unknown libraries,
○ Use an IDE to explore it
harsh, indeed...
implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = {
new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] {
def id[A] = ☆(_ η)
def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
}
}
Let's try to figure this one out
implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = {
new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] {
def id[A] = ☆(_ η)
def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
}
}
Split Scala Syntax from Identifiers
implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = {
new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] {
def id[A] = ☆(_ η)
def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
}
}
Identify what we are defining
implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = {
new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] {
def id[A] = ☆(_ η)
def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
}
}
Where we are using our definitions
implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = {
new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] {
def id[A] = ☆(_ η)
def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g
}
}
What's left are outside identifiers
The Underscore
● What does it mean?
● Why does it work here but not here?
● WTF?
● It's everywhere! It's the borg operator!
One underscore puzzler
Source: Stack overflow
The meanings of underscore
Source: myself, by way of Stack Overflow
The underscore is Scala's wildcard; it means
"something" or "anything" and even "nothing".
However, it's semantics can be widely different,
even in similar contexts.
Why?
● ???
● Picking a different symbol for each case
would stretch ASCII
● Picking keywords is not in the spirit of Scala
● They are somewhat intuitive
○ except when they bite you
Advice regarding underscore
● Intuition does go a long way
● But, again, learn the language
● And, in particular, know the difference
between these:
○ f _
○ f(_, y)
○ f(x + _, y)
Eta, partial function application and
placeholders
● f _
○ an eta expansion: turn method f into an anonymous function.
● f(_, y)
○ a partial function application: creates an anonymous function from
method f, whose parameters are the ones wholly replaced by
underscores.
● f(x + _, y)
○ a placeholder: creates an anonymous function from the expression "x
+ _", whose parameters are the underscores (and that function gets
passed to f).
_ always picks the tightest non-degenerate
scope it can
Seth Tisue
Erasure
● Where are my types?
● How do I get them back?
● WTF?
Some things that don't work
trait X {
def overload(f: Int => Int)
def overload(f: String => String)
}
Some things that don't work
def f[T](list: List[T]) = list match {
case _: List[Int] => "Ints"
case _: List[String] => "Strings"
case _ => "???"
}
Some things that don't work
class C[T] {
def f(obj: Any) = obj match {
case _: T => "Ours"
case _ => "Not Ours"
}
}
Why?
● JVM does not support "type parameters"
● If Scala added metadata to "eliminate"
erasure, the interaction gap between it and
Java would be much greater
○ Though things like implicits and default parameters
already do it, to some extent
○ At least, implicits and defaults are easy to avoid
Some things that don't work
trait X {
def overload(f: Function1[Int, Int])
def overload(f: Function1[String,
String])
}
Erasure at work
trait X {
def overload(f: Function1)
def overload(f: Function1)
}
Erasure at work
def f(list: List) = list match {
case _: List => "Ints"
case _: List => "Strings"
case _ => "???"
}
Erasure at work
class C {
def f(obj: Any) = obj match {
case _: Any => "Ours"
case _ => "Not Ours"
}
}
A partial solution
class C[T : ClassTag] {
def f(obj: Any) = obj match {
case _: T => "Ours"
case _ => "Not Ours"
}
} though it will still ignore T's type parameters
Initialization Order
trait A {
val a: Int
val b = a * 2
}
class B extends A {
val a = 5
println(b)
}
new B
All val’s are initialized in the order they
are found.
Initialization Order
trait A {
val foo: Int
val bar = 10
println("In A: foo: " + foo + ", bar: " + bar)
}
class B extends A {
val foo: Int = 25
println("In B: foo: " + foo + ", bar: " + bar)
}
class C extends B {
override val bar = 99
println("In C: foo: " + foo + ", bar: " + bar)
}
new C
Source: Paul Phillips scala-faq by way of scala puzzlers
Initialization Order
In A: foo: 0, bar: 0
In B: foo: 25, bar: 0
In C: foo: 25, bar: 99
Initialization Order
trait A {
val foo: Int
val bar = 10
println("In A: foo: " + foo + ", bar: " + bar)
}
class B extends A {
val foo: Int = 25
println("In B: foo: " + foo + ", bar: " + bar)
}
class C extends B {
override val bar = 99
println("In C: foo: " + foo + ", bar: " + bar)
}
new C
A val is initialized only once.
Initialization Order
trait A { val x = 5 }
trait B {
val x: Int
println(x * 2)
}
trait C extends A with B
trait D extends B
class E extends D with C { println(x * 2) }
class F extends C with D { println(x * 2) }
new E
new F
Initialization Order
0
10
10
10
Initialization Order
trait A { val x = 5 }
trait B {
val x: Int
println(x * 2)
}
trait C extends A with B
trait D extends B
class E extends B with D with A with B with C { println(x * 2) }
class F extends A with B with C with B with D { println(x * 2) }
new E
new F
Trait linearization...
Advice regarding initialization order
● Learn the _________
Other things to look out for
● Pattern matching on val's and for's
● All sorts of things implicit
● Syntactic sugars, auto-tupling and the like
● The return keyword
So, what did I learn?
It seems to me that there's a wide range of
Scala features that depend on the user having
deep knowledge of the language when
something goes wrong. "What's going on?"
seems to be much more common than "How do
I do this?"
As for real Puzzlers...
● Site:
○ http://scalapuzzlers.com/
● Book:
○ http://www.artima.com/shop/scala_puzzlers

More Related Content

What's hot (19)

PDF
Crystal: tipos, peculiaridades y desafios
Brian Cardiff
 
PPTX
Types, classes and concepts
Nicola Bonelli
 
PPTX
Typeclasses
ekalyoncu
 
PDF
Scala jargon cheatsheet
Ruslan Shevchenko
 
PDF
Cat's anatomy
Nicola Bonelli
 
PDF
Scala cheatsheet
Arduino Aficionado
 
PPTX
Types by Adform Research
Vasil Remeniuk
 
PDF
Introduction to Scala
Brian Hsu
 
PPTX
Category theory for beginners
kenbot
 
PDF
Contravariant functors in scala
Piotr Paradziński
 
PDF
Scala Types of Types @ Lambda Days
Konrad Malawski
 
PDF
Introduction to Scala for JCConf Taiwan
Jimin Hsieh
 
PDF
Scala vs java 8
François Sarradin
 
PPT
JAVA OOP
Sunil OS
 
PDF
Core csharp and net quick reference
ilesh raval
 
PDF
Big picture of category theory in scala with deep dive into contravariant and...
Piotr Paradziński
 
PDF
Why functional programming and category theory strongly matters
Piotr Paradziński
 
PDF
Scala categorytheory
Knoldus Inc.
 
PPTX
Strong typing : adoption, adaptation and organisation
Damien Seguy
 
Crystal: tipos, peculiaridades y desafios
Brian Cardiff
 
Types, classes and concepts
Nicola Bonelli
 
Typeclasses
ekalyoncu
 
Scala jargon cheatsheet
Ruslan Shevchenko
 
Cat's anatomy
Nicola Bonelli
 
Scala cheatsheet
Arduino Aficionado
 
Types by Adform Research
Vasil Remeniuk
 
Introduction to Scala
Brian Hsu
 
Category theory for beginners
kenbot
 
Contravariant functors in scala
Piotr Paradziński
 
Scala Types of Types @ Lambda Days
Konrad Malawski
 
Introduction to Scala for JCConf Taiwan
Jimin Hsieh
 
Scala vs java 8
François Sarradin
 
JAVA OOP
Sunil OS
 
Core csharp and net quick reference
ilesh raval
 
Big picture of category theory in scala with deep dive into contravariant and...
Piotr Paradziński
 
Why functional programming and category theory strongly matters
Piotr Paradziński
 
Scala categorytheory
Knoldus Inc.
 
Strong typing : adoption, adaptation and organisation
Damien Seguy
 

Similar to What can scala puzzlers teach us (20)

PDF
Introductiontoprogramminginscala
Amuhinda Hungai
 
PDF
Programming in scala - 1
Mukesh Kumar
 
PPTX
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
Andrew Phillips
 
PPTX
BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
Andrew Phillips
 
PDF
Programming in Scala - Lecture Three
Angelo Corsaro
 
PDF
Scala Paradigms
Tom Flaherty
 
PDF
Sequence and Traverse - Part 3
Philip Schwarz
 
PPTX
Scala basic
Nguyen Tuan
 
PDF
Programming in Scala: Notes
Roberto Casadei
 
PPTX
Scala training workshop 02
Nguyen Tuan
 
PPTX
Scala for curious
Tim (dev-tim) Zadorozhniy
 
PPTX
Principles of functional progrmming in scala
ehsoon
 
PDF
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
Andrey Breslav
 
PPTX
Intro to Scala
manaswinimysore
 
PDF
Power of functions in a typed world
Debasish Ghosh
 
PDF
Meet scala
Wojciech Pituła
 
PDF
Introduction to Scala : Clueda
Andreas Neumann
 
PPTX
Uncover and score the usages of the underscore
Franck Valentin
 
PDF
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
 
PPTX
Scala 3 Is Coming: Martin Odersky Shares What To Know
Lightbend
 
Introductiontoprogramminginscala
Amuhinda Hungai
 
Programming in scala - 1
Mukesh Kumar
 
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
Andrew Phillips
 
BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
Andrew Phillips
 
Programming in Scala - Lecture Three
Angelo Corsaro
 
Scala Paradigms
Tom Flaherty
 
Sequence and Traverse - Part 3
Philip Schwarz
 
Scala basic
Nguyen Tuan
 
Programming in Scala: Notes
Roberto Casadei
 
Scala training workshop 02
Nguyen Tuan
 
Scala for curious
Tim (dev-tim) Zadorozhniy
 
Principles of functional progrmming in scala
ehsoon
 
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
Andrey Breslav
 
Intro to Scala
manaswinimysore
 
Power of functions in a typed world
Debasish Ghosh
 
Meet scala
Wojciech Pituła
 
Introduction to Scala : Clueda
Andreas Neumann
 
Uncover and score the usages of the underscore
Franck Valentin
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
 
Scala 3 Is Coming: Martin Odersky Shares What To Know
Lightbend
 
Ad

More from Daniel Sobral (10)

PDF
Injecting Clock in Java
Daniel Sobral
 
PPTX
A JSR-310 Date: Beyond JODA Time
Daniel Sobral
 
PPTX
Gestão automática de configuração usando puppet
Daniel Sobral
 
PPTX
Scala 2.10.0 (english version)
Daniel Sobral
 
PPTX
Scala 2.10.0
Daniel Sobral
 
PDF
Palestra ganeti puppet
Daniel Sobral
 
ODP
Tutorial Puppet
Daniel Sobral
 
PPTX
Regex
Daniel Sobral
 
PPTX
Introdução a TDD
Daniel Sobral
 
PPTX
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Daniel Sobral
 
Injecting Clock in Java
Daniel Sobral
 
A JSR-310 Date: Beyond JODA Time
Daniel Sobral
 
Gestão automática de configuração usando puppet
Daniel Sobral
 
Scala 2.10.0 (english version)
Daniel Sobral
 
Scala 2.10.0
Daniel Sobral
 
Palestra ganeti puppet
Daniel Sobral
 
Tutorial Puppet
Daniel Sobral
 
Introdução a TDD
Daniel Sobral
 
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Daniel Sobral
 
Ad

Recently uploaded (20)

PDF
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Smart Air Quality Monitoring with Serrax AQM190 LITE
SERRAX TECHNOLOGIES LLP
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PPTX
Top iOS App Development Company in the USA for Innovative Apps
SynapseIndia
 
PDF
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PPTX
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
Persuasive AI: risks and opportunities in the age of digital debate
Speck&Tech
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
July Patch Tuesday
Ivanti
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Smart Air Quality Monitoring with Serrax AQM190 LITE
SERRAX TECHNOLOGIES LLP
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
Top iOS App Development Company in the USA for Innovative Apps
SynapseIndia
 
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Persuasive AI: risks and opportunities in the age of digital debate
Speck&Tech
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
July Patch Tuesday
Ivanti
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 

What can scala puzzlers teach us

  • 1. What Can Scala Puzzlers Teach Us? Daniel C. Sobral
  • 2. Disclaimer #1: "Puzzlers" ● Java Puzzlers (the book/presentations): ○ Weird behavior in Java that is difficult to predict or explain ● This presentation: ○ Weird behavior in Scala that confounds beginners ■ (and sometimes experienced programmers) ○ FAQs, not Fun
  • 3. I can't speak for any of the people who contributed to create and turn Scala into what it is. Furthermore, if you learn anything from this presentation, learn that a perfect understanding of Scala is an unlikely achievement... Disclaimer #2: don't trust me.
  • 4. Symbols, operators and punctuation ● What does it mean? ● Where can I find information about it? ● WTF?
  • 5. The symbol puzzler Source: Stack Overflow
  • 6. The Origin of the Symbols ● Punctuation elements of the language ○ @ # ( ) [ ] { } , . ; : ` ' " ● Keywords, reserved symbols and XML ○ <- => <: >: <% // /* */ _* <? <! ● Normal definitions from libraries ○ <:< =:= ☆ ★ η :/ ● Underscore ○ All of the above!
  • 7. Symbols may be part of the language or come from external libraries; it can be difficult to tell where they begin and end; they are difficult to search for on the Internet, non-mnemonic and unpronounceable.
  • 8. Then why? def f(xs: Array[Int], a: Int, b: Int) = for (i <- xs.indices) xs(i) = a * i + b
  • 9. So that libraries can extend the language seamlessly def f(xs: M[T], a: T, b: T) = for (i <- xs.indices) xs(i) = a * i + b For M and T library-types that support these operations
  • 10. Which still doesn't really justify unicode...
  • 11. Advice regarding Symbols ● Learn the language: ○ What symbols are "built-in" ○ The syntax rules ● If exploring code using unknown libraries, ○ Use an IDE to explore it harsh, indeed...
  • 12. implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = { new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] { def id[A] = ☆(_ η) def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g } } Let's try to figure this one out
  • 13. implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = { new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] { def id[A] = ☆(_ η) def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g } } Split Scala Syntax from Identifiers
  • 14. implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = { new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] { def id[A] = ☆(_ η) def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g } } Identify what we are defining
  • 15. implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = { new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] { def id[A] = ☆(_ η) def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g } } Where we are using our definitions
  • 16. implicit def KleisliCategory[M[_] : Monad]: Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] = { new Category[({type λ[α, β] = Kleisli[M, α, β]})#λ] { def id[A] = ☆(_ η) def compose[X, Y, Z](f: Kleisli[M, Y, Z], g: Kleisli[M, X, Y]) = f <=< g } } What's left are outside identifiers
  • 17. The Underscore ● What does it mean? ● Why does it work here but not here? ● WTF? ● It's everywhere! It's the borg operator!
  • 19. The meanings of underscore Source: myself, by way of Stack Overflow
  • 20. The underscore is Scala's wildcard; it means "something" or "anything" and even "nothing". However, it's semantics can be widely different, even in similar contexts.
  • 21. Why? ● ??? ● Picking a different symbol for each case would stretch ASCII ● Picking keywords is not in the spirit of Scala ● They are somewhat intuitive ○ except when they bite you
  • 22. Advice regarding underscore ● Intuition does go a long way ● But, again, learn the language ● And, in particular, know the difference between these: ○ f _ ○ f(_, y) ○ f(x + _, y)
  • 23. Eta, partial function application and placeholders ● f _ ○ an eta expansion: turn method f into an anonymous function. ● f(_, y) ○ a partial function application: creates an anonymous function from method f, whose parameters are the ones wholly replaced by underscores. ● f(x + _, y) ○ a placeholder: creates an anonymous function from the expression "x + _", whose parameters are the underscores (and that function gets passed to f).
  • 24. _ always picks the tightest non-degenerate scope it can Seth Tisue
  • 25. Erasure ● Where are my types? ● How do I get them back? ● WTF?
  • 26. Some things that don't work trait X { def overload(f: Int => Int) def overload(f: String => String) }
  • 27. Some things that don't work def f[T](list: List[T]) = list match { case _: List[Int] => "Ints" case _: List[String] => "Strings" case _ => "???" }
  • 28. Some things that don't work class C[T] { def f(obj: Any) = obj match { case _: T => "Ours" case _ => "Not Ours" } }
  • 29. Why? ● JVM does not support "type parameters" ● If Scala added metadata to "eliminate" erasure, the interaction gap between it and Java would be much greater ○ Though things like implicits and default parameters already do it, to some extent ○ At least, implicits and defaults are easy to avoid
  • 30. Some things that don't work trait X { def overload(f: Function1[Int, Int]) def overload(f: Function1[String, String]) }
  • 31. Erasure at work trait X { def overload(f: Function1) def overload(f: Function1) }
  • 32. Erasure at work def f(list: List) = list match { case _: List => "Ints" case _: List => "Strings" case _ => "???" }
  • 33. Erasure at work class C { def f(obj: Any) = obj match { case _: Any => "Ours" case _ => "Not Ours" } }
  • 34. A partial solution class C[T : ClassTag] { def f(obj: Any) = obj match { case _: T => "Ours" case _ => "Not Ours" } } though it will still ignore T's type parameters
  • 35. Initialization Order trait A { val a: Int val b = a * 2 } class B extends A { val a = 5 println(b) } new B
  • 36. All val’s are initialized in the order they are found.
  • 37. Initialization Order trait A { val foo: Int val bar = 10 println("In A: foo: " + foo + ", bar: " + bar) } class B extends A { val foo: Int = 25 println("In B: foo: " + foo + ", bar: " + bar) } class C extends B { override val bar = 99 println("In C: foo: " + foo + ", bar: " + bar) } new C Source: Paul Phillips scala-faq by way of scala puzzlers
  • 38. Initialization Order In A: foo: 0, bar: 0 In B: foo: 25, bar: 0 In C: foo: 25, bar: 99
  • 39. Initialization Order trait A { val foo: Int val bar = 10 println("In A: foo: " + foo + ", bar: " + bar) } class B extends A { val foo: Int = 25 println("In B: foo: " + foo + ", bar: " + bar) } class C extends B { override val bar = 99 println("In C: foo: " + foo + ", bar: " + bar) } new C
  • 40. A val is initialized only once.
  • 41. Initialization Order trait A { val x = 5 } trait B { val x: Int println(x * 2) } trait C extends A with B trait D extends B class E extends D with C { println(x * 2) } class F extends C with D { println(x * 2) } new E new F
  • 43. Initialization Order trait A { val x = 5 } trait B { val x: Int println(x * 2) } trait C extends A with B trait D extends B class E extends B with D with A with B with C { println(x * 2) } class F extends A with B with C with B with D { println(x * 2) } new E new F
  • 45. Advice regarding initialization order ● Learn the _________
  • 46. Other things to look out for ● Pattern matching on val's and for's ● All sorts of things implicit ● Syntactic sugars, auto-tupling and the like ● The return keyword
  • 47. So, what did I learn? It seems to me that there's a wide range of Scala features that depend on the user having deep knowledge of the language when something goes wrong. "What's going on?" seems to be much more common than "How do I do this?"
  • 48. As for real Puzzlers... ● Site: ○ http://scalapuzzlers.com/ ● Book: ○ http://www.artima.com/shop/scala_puzzlers