SlideShare a Scribd company logo
Exploring
Type-Level Programming
in Scala
JORGE VÁSQUEZ
SCALA DEVELOPER
Exploring type level programming in Scala
Agenda
● Motivations around Type-Level Programming in Scala
● Background
○ Dependent types
○ Path-dependent types
○ Abstract type members
● Examples of libraries that use Type-Level
Programming
Motivations
around
Type-Level
Programming
Why Type-Level Programming?
● We turn to Scala for type-safety
● But… Sometimes it’s not enough!
Concrete example: Spark DataFrame API
We have lots of potential for runtime bugs!
Concrete example: Spark DataFrame API
df.select(
$"username",
$"tweet"
)
Concrete example: Spark DataFrame API
Error: org.apache.spark.sql.
AnalysisException: cannot
resolve '`username`'
Concrete example: Spark DataFrame API
df.select(
$"timestamp" * 10
)
Concrete example: Spark DataFrame API
Error:
org.apache.spark.sql.
AnalysisException: cannot
resolve '(`timestamp` *
10)' due to data type
mismatch
Concrete example: Spark DataFrame API
df.filter(
$"text" === true
)
// Does not fail
Concrete example: Spark DataFrame API
df.select(
$"text" / 1000
)
// Does not fail
Exploring type level programming in Scala
Can we do better?
Scala has a VERY powerful type system,
why not use it?
Concrete example: Spark with Frameless
Frameless helps us to eliminate a lot of bugs…
At compile time!
Concrete example: Spark with Frameless
tds.select(
tds('username),
tds('tweet)
)
Concrete example: Spark with Frameless
// Error:
No column Symbol with
shapeless.tag.Tagged[Str
ing("username")]
Concrete example: Spark with Frameless
tds.select(
tds('timestamp) * 10
)
Concrete example: Spark with Frameless
// Error:
overloaded method value
* with alternatives
[...] cannot be applied
to (Int)
Concrete example: Spark with Frameless
tds.filter(
tds('text) === true
)
Concrete example: Spark with Frameless
// Error:
overloaded method value
=== with alternatives
[...] cannot be applied
to (Boolean)
Concrete example: Spark with Frameless
tds.select(
tds('text) / 1000
)
Concrete example: Spark with Frameless
// Error:
overloaded method value /
with alternatives [...]
cannot be applied to
(Int)
In conclusion...
Type-level Programming lets you eliminate
bugs at compile-time
In conclusion...
Our focus today: Dependent types
Dependent types are the heart of
Type-Level Programming in Scala
What are
Dependent Types?
What are Dependent Types?
● Dependent Types are types that depend on
values.
● With this, we remove the usual separation
between the type and value worlds.
What are Dependent Types?
● Scala is not a fully dependently typed
language.
● However, it supports some form of
Dependent Types, which is called Path
Dependent Types.
How we define Path Dependent Types?
● In Scala, we can define nested components
● For example, a class inside a trait, a
trait inside a class, etc.
How we define Path Dependent Types?
sealed trait Foo {
sealed trait Bar
}
val foo1 = new Foo {}
val foo2 = new Foo {}
val a: Foo#Bar = new foo1.Bar {} // OK
val b: Foo#Bar = new foo2.Bar {} // OK
val c: foo1.Bar = new foo1.Bar {} // OK
val d: foo2.Bar = new foo1.Bar {}
// Required: foo2.Bar, Found: foo1.Bar
How we define Path Dependent Types?
● Another useful tool is Abstract Type
Members, which are types we don’t know
yet and that we can define later
trait Bar {
type T
}
Example 1: Merging Files
Define a merge function, which should take:
● A list of files
● A merge strategy: Single/Multiple/None
● A callback function: Which should expect:
○ A single file if merge strategy is Single
○ A list of files if merge strategy is Multiple
○ A unit value if merge strategy is None
Example 1: Merging Files
import java.io.File
sealed trait MergeStrategy {
type Output
}
object MergeStrategy {
case object Single extends MergeStrategy { type Output = File }
case object Multiple extends MergeStrategy { type Output = List[File] }
case object None extends MergeStrategy { type Output = Unit }
}
def mergeFiles(files: List[File]): File = ???
Example 1: Merging Files
def merge[T](files: List[File], mergeStrategy: MergeStrategy)
(f: mergeStrategy.Output => T): T =
mergeStrategy match {
case MergeStrategy.Single => f(mergeFiles(files))
case MergeStrategy.Multiple => f(files)
case MergeStrategy.None => f(())
}
Example 1: Merging Files
Example 1: Merging Files
def merge[O, T](
files: List[File],
mergeStrategy: MergeStrategy { type Output = O }
)(f: O => T): T =
mergeStrategy match {
case MergeStrategy.Single => f(mergeFiles(files))
case MergeStrategy.Multiple => f(files)
case MergeStrategy.None => f(())
}
Example 1: Merging Files
val files: List[File] = ???
merge(files, MergeStrategy.Single) { file: File =>
// Do some processing
}
merge(files, MergeStrategy.Multiple) { files: List[File] =>
// Do some processing
}
merge(files, MergeStrategy.None) { _: Unit =>
// Do some processing
}
Example 2: Merging Elements
Define a merge function, which should take:
● A list of elements of any type
● A merge strategy: Single/Multiple/None
● A callback function: Which should expect:
○ A single element if merge strategy is Single
○ A list of elements if merge strategy is Multiple
○ A unit value if merge strategy is None
Example 2: Merging Elements
sealed trait MergeStrategy {
type Output[_]
}
object MergeStrategy {
case object Single extends MergeStrategy { type Output[A] = A }
case object Multiple extends MergeStrategy { type Output[A] = List[A] }
case object None extends MergeStrategy { type Output[_] = Unit }
}
def mergeElements[E](elements: List[E]): E = ???
Example 2: Merging Elements
def merge[E, O[_], T](
elements: List[E],
mergeStrategy: MergeStrategy { type Output[A] = O[A] }
)(f: O[E] => T): T =
mergeStrategy match {
case MergeStrategy.Single => f(mergeElements(elements))
case MergeStrategy.Multiple => f(elements)
case MergeStrategy.None => f(())
}
Example 2: Merging Elements
val messages: List[String] = ???
merge(messages, MergeStrategy.Single) { message: String =>
// Do some processing
}
merge(messages, MergeStrategy.Multiple) { messages: List[String] =>
// Do some processing
}
merge(messages, MergeStrategy.None) { _: Unit =>
// Do some processing
}
In conclusion...
● Path-dependent types are the heart and
soul of Scala's type system
● They help you to improve compile-time type
safety
In conclusion...
DOTTY = DOT Calculus = Path Dependent Types
Some example
libraries
Examples of libraries that use
Type Level Programming
● Shapeless: Generic programming
○ Generic Product Type: HList
○ Generic Sum Type: Coproduct
Examples of libraries that use
Type Level Programming
● Frameless: Expressive types for Spark
Examples of libraries that use
Type Level Programming
● Refined: Refinement types
Examples of libraries that use
Type Level Programming
● ZIO SQL: Type-safe SQL queries
References
● Dependent types in Scala, blog post by Yao Li
● Type Level Programming in Scala step by
step, blog series by Luigi Antonini
● The Type Astronaut’s Guide to Shapeless
Book, by Dave Gurnell
● Introduction to Apache Spark with Frameless,
by Brian Clapper
Special thanks
● To micro sphere.it organizers for hosting this
presentation
● To John De Goes for guidance and support
Thank You!
@jorvasquez2301
jorge.vasquez@scalac.io
jorge-vasquez-2301
Contact me

More Related Content

What's hot (20)

PDF
Scala collections api expressivity and brevity upgrade from java
IndicThreads
 
PPTX
Scala for curious
Tim (dev-tim) Zadorozhniy
 
PPTX
jQuery
Julie Iskander
 
PDF
Property based Testing - generative data & executable domain rules
Debasish Ghosh
 
PDF
Python programming : Classes objects
Emertxe Information Technologies Pvt Ltd
 
PDF
First-Class Patterns
John De Goes
 
PDF
Scala for Jedi
Vladimir Parfinenko
 
PPT
Spsl v unit - final
Sasidhar Kothuru
 
PDF
A bit about Scala
Vladimir Parfinenko
 
PDF
Pragmatic Real-World Scala (short version)
Jonas Bonér
 
PDF
Getting Started With Scala
Meetu Maltiar
 
PDF
The Ring programming language version 1.5.1 book - Part 31 of 180
Mahmoud Samir Fayed
 
KEY
Scala for ruby programmers
tymon Tobolski
 
PDF
Python programming : Inheritance and polymorphism
Emertxe Information Technologies Pvt Ltd
 
ODP
Introducing scala
Meetu Maltiar
 
PDF
Scala collections
Inphina Technologies
 
PDF
Practical cats
Raymond Tay
 
PDF
An introduction to property-based testing
Vincent Pradeilles
 
PDF
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
scalaconfjp
 
ODP
2.1 Recap From Day One
retronym
 
Scala collections api expressivity and brevity upgrade from java
IndicThreads
 
Scala for curious
Tim (dev-tim) Zadorozhniy
 
Property based Testing - generative data & executable domain rules
Debasish Ghosh
 
Python programming : Classes objects
Emertxe Information Technologies Pvt Ltd
 
First-Class Patterns
John De Goes
 
Scala for Jedi
Vladimir Parfinenko
 
Spsl v unit - final
Sasidhar Kothuru
 
A bit about Scala
Vladimir Parfinenko
 
Pragmatic Real-World Scala (short version)
Jonas Bonér
 
Getting Started With Scala
Meetu Maltiar
 
The Ring programming language version 1.5.1 book - Part 31 of 180
Mahmoud Samir Fayed
 
Scala for ruby programmers
tymon Tobolski
 
Python programming : Inheritance and polymorphism
Emertxe Information Technologies Pvt Ltd
 
Introducing scala
Meetu Maltiar
 
Scala collections
Inphina Technologies
 
Practical cats
Raymond Tay
 
An introduction to property-based testing
Vincent Pradeilles
 
Functional Object-Oriented Imperative Scala / 関数型オブジェクト指向命令型 Scala by Sébasti...
scalaconfjp
 
2.1 Recap From Day One
retronym
 

Similar to Exploring type level programming in Scala (20)

PDF
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
PPTX
Scala Intro
Alexey (Mr_Mig) Migutsky
 
PDF
Scala In The Wild
djspiewak
 
PPT
scala.ppt
Harissh16
 
PDF
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
PDF
Miles Sabin Introduction To Scala For Java Developers
Skills Matter
 
PDF
Is there a perfect data-parallel programming language? (Experiments with More...
Julian Hyde
 
PPTX
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
PDF
From Java to Scala - advantages and possible risks
SeniorDevOnly
 
PDF
Introduction to Scala
Aleksandar Prokopec
 
PDF
An Introduction to Scala - Blending OO and Functional Paradigms
Miles Sabin
 
PDF
Scala - core features
Łukasz Wójcik
 
PPT
Scala
Zhiwen Guo
 
PDF
Introduction To Scala
Innar Made
 
PDF
Scala Paradigms
Tom Flaherty
 
PDF
Scala or functional programming from a python developer's perspective
gabalese
 
PDF
Scala Types of Types @ Lambda Days
Konrad Malawski
 
PDF
Introduction to Scala : Clueda
Andreas Neumann
 
PDF
Meet scala
Wojciech Pituła
 
PPTX
Scala training workshop 02
Nguyen Tuan
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
Scala In The Wild
djspiewak
 
scala.ppt
Harissh16
 
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
Miles Sabin Introduction To Scala For Java Developers
Skills Matter
 
Is there a perfect data-parallel programming language? (Experiments with More...
Julian Hyde
 
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
From Java to Scala - advantages and possible risks
SeniorDevOnly
 
Introduction to Scala
Aleksandar Prokopec
 
An Introduction to Scala - Blending OO and Functional Paradigms
Miles Sabin
 
Scala - core features
Łukasz Wójcik
 
Scala
Zhiwen Guo
 
Introduction To Scala
Innar Made
 
Scala Paradigms
Tom Flaherty
 
Scala or functional programming from a python developer's perspective
gabalese
 
Scala Types of Types @ Lambda Days
Konrad Malawski
 
Introduction to Scala : Clueda
Andreas Neumann
 
Meet scala
Wojciech Pituła
 
Scala training workshop 02
Nguyen Tuan
 
Ad

More from Jorge Vásquez (6)

PDF
Behold! The Happy Path To Captivate Your Users With Stunning CLI Apps!
Jorge Vásquez
 
PDF
Programación Funcional 101 con Scala y ZIO 2.0
Jorge Vásquez
 
PDF
Consiguiendo superpoderes para construir aplicaciones modernas en la JVM con ZIO
Jorge Vásquez
 
PDF
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Jorge Vásquez
 
PDF
The Terror-Free Guide to Introducing Functional Scala at Work
Jorge Vásquez
 
PDF
Introduction to programming with ZIO functional effects
Jorge Vásquez
 
Behold! The Happy Path To Captivate Your Users With Stunning CLI Apps!
Jorge Vásquez
 
Programación Funcional 101 con Scala y ZIO 2.0
Jorge Vásquez
 
Consiguiendo superpoderes para construir aplicaciones modernas en la JVM con ZIO
Jorge Vásquez
 
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Jorge Vásquez
 
The Terror-Free Guide to Introducing Functional Scala at Work
Jorge Vásquez
 
Introduction to programming with ZIO functional effects
Jorge Vásquez
 
Ad

Recently uploaded (20)

PDF
MiniTool Partition Wizard 12.8 Crack License Key LATEST
hashhshs786
 
PDF
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
PPTX
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
PDF
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
PDF
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
PDF
Unlock Efficiency with Insurance Policy Administration Systems
Insurance Tech Services
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PPTX
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
PDF
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
PPTX
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
PPTX
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PPTX
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Transforming Mining & Engineering Operations with Odoo ERP | Streamline Proje...
SatishKumar2651
 
PDF
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PDF
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
MiniTool Partition Wizard 12.8 Crack License Key LATEST
hashhshs786
 
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
Unlock Efficiency with Insurance Policy Administration Systems
Insurance Tech Services
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Transforming Mining & Engineering Operations with Odoo ERP | Streamline Proje...
SatishKumar2651
 
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 

Exploring type level programming in Scala

  • 4. Agenda ● Motivations around Type-Level Programming in Scala ● Background ○ Dependent types ○ Path-dependent types ○ Abstract type members ● Examples of libraries that use Type-Level Programming
  • 6. Why Type-Level Programming? ● We turn to Scala for type-safety ● But… Sometimes it’s not enough!
  • 7. Concrete example: Spark DataFrame API We have lots of potential for runtime bugs!
  • 8. Concrete example: Spark DataFrame API df.select( $"username", $"tweet" )
  • 9. Concrete example: Spark DataFrame API Error: org.apache.spark.sql. AnalysisException: cannot resolve '`username`'
  • 10. Concrete example: Spark DataFrame API df.select( $"timestamp" * 10 )
  • 11. Concrete example: Spark DataFrame API Error: org.apache.spark.sql. AnalysisException: cannot resolve '(`timestamp` * 10)' due to data type mismatch
  • 12. Concrete example: Spark DataFrame API df.filter( $"text" === true ) // Does not fail
  • 13. Concrete example: Spark DataFrame API df.select( $"text" / 1000 ) // Does not fail
  • 15. Can we do better? Scala has a VERY powerful type system, why not use it?
  • 16. Concrete example: Spark with Frameless Frameless helps us to eliminate a lot of bugs… At compile time!
  • 17. Concrete example: Spark with Frameless tds.select( tds('username), tds('tweet) )
  • 18. Concrete example: Spark with Frameless // Error: No column Symbol with shapeless.tag.Tagged[Str ing("username")]
  • 19. Concrete example: Spark with Frameless tds.select( tds('timestamp) * 10 )
  • 20. Concrete example: Spark with Frameless // Error: overloaded method value * with alternatives [...] cannot be applied to (Int)
  • 21. Concrete example: Spark with Frameless tds.filter( tds('text) === true )
  • 22. Concrete example: Spark with Frameless // Error: overloaded method value === with alternatives [...] cannot be applied to (Boolean)
  • 23. Concrete example: Spark with Frameless tds.select( tds('text) / 1000 )
  • 24. Concrete example: Spark with Frameless // Error: overloaded method value / with alternatives [...] cannot be applied to (Int)
  • 25. In conclusion... Type-level Programming lets you eliminate bugs at compile-time
  • 27. Our focus today: Dependent types Dependent types are the heart of Type-Level Programming in Scala
  • 29. What are Dependent Types? ● Dependent Types are types that depend on values. ● With this, we remove the usual separation between the type and value worlds.
  • 30. What are Dependent Types? ● Scala is not a fully dependently typed language. ● However, it supports some form of Dependent Types, which is called Path Dependent Types.
  • 31. How we define Path Dependent Types? ● In Scala, we can define nested components ● For example, a class inside a trait, a trait inside a class, etc.
  • 32. How we define Path Dependent Types? sealed trait Foo { sealed trait Bar } val foo1 = new Foo {} val foo2 = new Foo {} val a: Foo#Bar = new foo1.Bar {} // OK val b: Foo#Bar = new foo2.Bar {} // OK val c: foo1.Bar = new foo1.Bar {} // OK val d: foo2.Bar = new foo1.Bar {} // Required: foo2.Bar, Found: foo1.Bar
  • 33. How we define Path Dependent Types? ● Another useful tool is Abstract Type Members, which are types we don’t know yet and that we can define later trait Bar { type T }
  • 34. Example 1: Merging Files Define a merge function, which should take: ● A list of files ● A merge strategy: Single/Multiple/None ● A callback function: Which should expect: ○ A single file if merge strategy is Single ○ A list of files if merge strategy is Multiple ○ A unit value if merge strategy is None
  • 35. Example 1: Merging Files import java.io.File sealed trait MergeStrategy { type Output } object MergeStrategy { case object Single extends MergeStrategy { type Output = File } case object Multiple extends MergeStrategy { type Output = List[File] } case object None extends MergeStrategy { type Output = Unit } } def mergeFiles(files: List[File]): File = ???
  • 36. Example 1: Merging Files def merge[T](files: List[File], mergeStrategy: MergeStrategy) (f: mergeStrategy.Output => T): T = mergeStrategy match { case MergeStrategy.Single => f(mergeFiles(files)) case MergeStrategy.Multiple => f(files) case MergeStrategy.None => f(()) }
  • 38. Example 1: Merging Files def merge[O, T]( files: List[File], mergeStrategy: MergeStrategy { type Output = O } )(f: O => T): T = mergeStrategy match { case MergeStrategy.Single => f(mergeFiles(files)) case MergeStrategy.Multiple => f(files) case MergeStrategy.None => f(()) }
  • 39. Example 1: Merging Files val files: List[File] = ??? merge(files, MergeStrategy.Single) { file: File => // Do some processing } merge(files, MergeStrategy.Multiple) { files: List[File] => // Do some processing } merge(files, MergeStrategy.None) { _: Unit => // Do some processing }
  • 40. Example 2: Merging Elements Define a merge function, which should take: ● A list of elements of any type ● A merge strategy: Single/Multiple/None ● A callback function: Which should expect: ○ A single element if merge strategy is Single ○ A list of elements if merge strategy is Multiple ○ A unit value if merge strategy is None
  • 41. Example 2: Merging Elements sealed trait MergeStrategy { type Output[_] } object MergeStrategy { case object Single extends MergeStrategy { type Output[A] = A } case object Multiple extends MergeStrategy { type Output[A] = List[A] } case object None extends MergeStrategy { type Output[_] = Unit } } def mergeElements[E](elements: List[E]): E = ???
  • 42. Example 2: Merging Elements def merge[E, O[_], T]( elements: List[E], mergeStrategy: MergeStrategy { type Output[A] = O[A] } )(f: O[E] => T): T = mergeStrategy match { case MergeStrategy.Single => f(mergeElements(elements)) case MergeStrategy.Multiple => f(elements) case MergeStrategy.None => f(()) }
  • 43. Example 2: Merging Elements val messages: List[String] = ??? merge(messages, MergeStrategy.Single) { message: String => // Do some processing } merge(messages, MergeStrategy.Multiple) { messages: List[String] => // Do some processing } merge(messages, MergeStrategy.None) { _: Unit => // Do some processing }
  • 44. In conclusion... ● Path-dependent types are the heart and soul of Scala's type system ● They help you to improve compile-time type safety
  • 45. In conclusion... DOTTY = DOT Calculus = Path Dependent Types
  • 47. Examples of libraries that use Type Level Programming ● Shapeless: Generic programming ○ Generic Product Type: HList ○ Generic Sum Type: Coproduct
  • 48. Examples of libraries that use Type Level Programming ● Frameless: Expressive types for Spark
  • 49. Examples of libraries that use Type Level Programming ● Refined: Refinement types
  • 50. Examples of libraries that use Type Level Programming ● ZIO SQL: Type-safe SQL queries
  • 51. References ● Dependent types in Scala, blog post by Yao Li ● Type Level Programming in Scala step by step, blog series by Luigi Antonini ● The Type Astronaut’s Guide to Shapeless Book, by Dave Gurnell ● Introduction to Apache Spark with Frameless, by Brian Clapper
  • 52. Special thanks ● To micro sphere.it organizers for hosting this presentation ● To John De Goes for guidance and support