SlideShare a Scribd company logo
Scala’s	

Types of Types
bg = game @ http://www.swordandsworcery.com/

Konrad 'ktoso' Malawski	

Lambda Days 2014 @ Kraków
_@

Konrad `@ktosopl` Malawski

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
Types
Types

“Implementation is an implementation detail.”	

~ ktoso
Types in Scala
Types in Scala
Types in Scala
Types are:	

!

static

class Robot!
class Human !
!
val human: Human = new Human!
val roman: Human = new Robot!
!
!
error: type mismatch;!
!
found
: Robot!
!
required: Human!
!
val robot: Human = new Robot!
!

^
Types in Scala
Types are:	

!

static
strong

var two = 2!
two = "two"!
!

error: type mismatch;!
found
: String("two")!
required: Int!
two = "two"!
^
Types in Scala
Types are:	

!

static
strong
inferred
!

val n = 2!
n.getClass.toString == "int"!
!
!
!class Human!
!val p = new Human!

p.getClass.toString == "class Human"
Types in Scala
Types are:	

!
val n: Int = 2

!

static
strong
inferred
annotated after :	


!
!

!
def add(a: Int, b: Int): Int!
Types with Traits
Types with Traits
Traits are:	

!

interfaces
!

implementation:	


trait HasName { !
def name: String!
}!
!
!

class Human extends HasName {!
def name = ""!
}
class Human(val name: String) !
extends HasName!
Types with Traits
Traits are:	

!

interfaces
with implementation
!

trait HasName { def name = "name" }!
!

object Human extends HasName!
!

Human.name == "name"!
Types with Traits
Traits are:	

!

interfaces
with implementation
can be “mixed in”

trait Robot!
trait Humanoid!
trait Lasers!
!

object X extends Robot !
with Humanoid!
with Lasers!
!

Multiple inheritance panic?!
Type linearization

trait Robot extends Lasers!
trait Humanoid!
trait Lasers

object X extends Robot !
with Humanoid!
with Lasers

// type linearization:!
X Robot Humanoid Lasers
// reverse!
X Lasers Humanoid Robot! !
!
// expand!
X Lasers Humanoid Robot Lasers
// right-keep-unique!
X Lasers Humanoid Robot Lasers!
X
Humanoid Robot Lasers
// add common!
X
Humanoid Robot Lasers Object Any
Type linearization

trait Robot extends Lasers!
trait Humanoid!
trait Lasers

object X extends Robot !
with Humanoid!
with Lasers

// don’t trust me, trust the compiler:!
import scala.reflect.runtime.universe._!
typeOf[X.type].baseClasses.map(_.name).mkString(“ extends ")!
!

// output:!
X extends Humanoid !
extends Robot extends Lasers !
extends Object extends Any!
Type linearization
reordered slightly
trait Robot extends Lasers!
trait Humanoid!
trait Lasers

object X extends Humanoid!
with Lasers!
with Robot

// type linearization:!
X Humanoid Lasers Robot
// reverse!
X Robot Lasers Humanoid! !
!
// expand!
X Robot Lasers Lasers Humanoid
// right-keep-unique!
X Robot Lasers Lasers Humanoid!
X Robot
Lasers Humanoid
// add common!
X Robot
Lasers Humanoid Object Any
Type linearization

trait Robot extends Lasers!
trait Humanoid!
trait Lasers

object X extends Humanoid!
with Lasers!
with Robot

// don’t trust me, trust the compiler:!
import scala.reflect.runtime.universe._!
typeOf[X.type].baseClasses.map(_.name).mkString(“ extends ")!
!

// output:!
X extends Robot !
extends Lasers extends Humanoid!
extends Object extends Any!
Type Refinement
Type Refinement
trait Human!
trait Robot

val human: Human = new Human {}!
val roman: Human = new Robot!
Type Refinement
trait Human!
trait Robot

val human: Human = new Human {}!
val roman: Human = new Robot with Human!

plain trait composition
type refinement

Waaah! 	

It’s a robot with human traits!
Compound Types
Compound Types
are	

intersections
of types
!
!
!
!
!

trait
def
}!
trait
def
}!

Openable {!
open()!
Closable {!
close()!
Compound Types
are	

intersections
!

!
!
!
!

open()

trait
def
}!
trait
def
}!

Openable {!
open()!
Closable {!
close()!

close()
Compound Types
are	

intersections
!

trait
def
}!
trait
def
}!

Openable {!
open()!
Closable {!
close()!

!
!
! def openAndClose(it: Openable with Closable) {!
it.open()
!
!

it.close()!
}
Compound Types
are	

intersections
!

trait
def
}!
trait
def
}!

Openable {!
open()!
Closable {!
close()!

!
!
! def openAndClose(it: Openable with Closable) {!
it.open()
!
!

it.close()!
}
Compound Types

this.type

trait
def
}!
trait
def
}!

Openable {!
open(): this.type!
Closable {!
close()!

!
!
!
def openAndClose(it: Openable with Closable) =!
!

it.open().close()
!

Type Parameters
!

Type Parameters	

[Type Variance]
!

Type Parameters	

[Type Variance]	

<: Type Bounds >:
Type Parameters
type constructor

class C[T]
type parameter
Type Variance

class C[T] // in-variant!
class C[+T] // co-variant!
class C[-T] // contra-variant!
Type Bounds (still variance)

class Parent!
class Bottom extends Parent!
!

Type Bounds	

!

Parent >: Bottom
Bottom <: Parent
Parent =:= Parent

// parent is “more” general!
// bottom is “less” general!
// parent is “equal” parent
Type Variance
class C[T]

// in-variant

val x: C[Parent] = new C[Parent]!
!

val x: C[Parent] = new C[Bottom]!
error: type mismatch; found: C[Bottom] required: C[Parent]!
Note: Bottom <: Parent, but class C is invariant in type A.!
You may wish to define A as +A instead. (SLS 4.5)!
!

val x: C[Bottom] = new C[Parent]!
error: type mismatch; found: C[Parent] required: C[Bottom]!
Note: Parent >: Bottom, but class C is invariant in type A.!
You may wish to define A as -A instead. (SLS 4.5)!
Type Variance
class C[+T]

// co-variant

val x: C[Parent] = new C[Parent]!
!

val x: C[Parent] = new C[Bottom]!
!

val x: C[Bottom] = new C[Parent]!
error: type mismatch; found: C[Parent] required: C[Bottom]!
!
!
Type Variance
class C[-T]

// contra-variant

val x: C[Parent] = new C[Parent]!
!

val x: C[Parent] = new C[Bottom]!
error: type mismatch; found: C[Bottom] required: C[Parent]!
!

val x: C[Bottom] = new C[Parent]!
!
!
Structural Type
Structural Types

// a type!
class Closeable {!
def close()!
}

=>

// structural type!
type Closeable = {!
def close()!
}
Structural Types
Kinda’ like “duck typing”

def send(msg: String, box: {def receive(a: String)}) =!
box receive msg

structural type
Structural Types
type alias
type MailBoxLike = { !
def receive(a: String)!
}
def send(msg: String, box: MailboxLike) =!
box receive msg
Structural Types

type MailBoxLike = { !
def receive(a: String)!
}
def send(msg: String, box: MailboxLike) =!
box receive msg
object Home { def receive(a: String) = ??? }!
object Work { def receive(a: String) = ??? }
send("hello at home", Home)!
send("hello at work", Work)
Type Member
Type Member
Same goal as	

Type Parameter
if List was using Type Params
trait StringList!
extends List[String]

=>

trait StringList !
extends List {!
type A = String!
}

if List was using Type Members
Type Member + Type Bound
Same as + / - variance
trait List {!
type A!
}

=>

trait NumbersList extends List {!
type A <: Number!
}

trait IntegerList extends NumbersList {!
type A = Integer!
}
trait FailList extends NumbersList {!
type A = Human // Human is not <: Number!!
}
Type Alias
Without Type Alias
“1st” and “2nd” type param
ALL HOPE IS LOST!
object `bytes -> string` !
extends Builder[Array[Byte], String] {!
!
def make(in: Array[Byte]): String = new String(in)!
}!
Without Type Alias
“1st” and “2nd” type param
Some meaning is lost!
object `bytes -> string` !
extends Builder[Array[Byte], String] {!
!
def make(in: Array[Byte]): String = new String(in)!
}!
Type Alias
From Type Parameter to Type Members

trait Builder[From, To]

=>

trait Builder {!
type From!
type To!
def make(in: From): To!
}
Type Alias

trait Builder { type From; type To; def make(in: From): To }!
trait StringBuilder extends Builder {!
type To = String!
}
trait FromBytesBuilder extends Builder {!
type From = Array[Byte]!
}
object `bytes -> string` extends Builder!
with FromBytesBuilder!
with StringBuilder {!
!
def make(in: From): To = new String(in)!
}!
Type Alias

trait Builder { type From; type To; def make(in: From): To }!

object `bytes -> string` extends Builder {!
type From = Array[Bytes]!
type To = String!
!

def make(in: From): To = new String(in)!
}!
Phantom Types
Phantom Types

Phantom Types are never actually instanciated.

Exactly!

uhm… where are they?
Phantom Types
Marker traits:
sealed trait DoorState!
final class Open
extends DoorState!
final class Closed extends DoorState!
Phantom Types
Marker traits:
sealed trait DoorState!
final class Open
extends DoorState!
final class Closed extends DoorState!

trait Door[State <: DoorState] {!
!

def open[T >: State <: Closed](): Door[Open] !
!
!

def close[T >: State <: Open](): Door[Closed]!
!

}!
!
Phantom Types
Only slide in this talk with implementation!

class Door[State <: DoorState] private () {!
!

def open[T >: State <: Closed]() = !
this.asInstanceOf[Door[Open]]!
!

def close[T >: State <: Open]() =
this.asInstanceOf[Door[Closed]]!

!

}!
!

object Door { def apply() = new Door[Closed] }
Phantom Types
Marker traits:
sealed trait DoorState!
final class Open
extends DoorState!
final class Closed extends DoorState!

class Door[State <: DoorState] private () {!
!

def open[T >: State <: Closed]() = !
this.asInstanceOf[Door[Open]]!
!

def stop[T >: State <: Open]() =
!
this.asInstanceOf[Door[Closed]]!
}!
!

object Door { def apply() = new Door[Closed] }
Phantom Types
Marker traits:
sealed trait DoorState!
final class Open
extends DoorState!
final class Closed extends DoorState!

class Door[State <: DoorState] private () {!
!

def open[T >: State <: Closed]() = !
this.asInstanceOf[Door[Open]]!
!

def stop[T >: State <: Open]() =
!
this.asInstanceOf[Door[Closed]]!
}!
!

object Door { def apply() = new Door[Closed] }
Phantom Types
Marker traits:
sealed trait DoorState!
final class Open
extends DoorState!
final class Closed extends DoorState!

class Door[State <: DoorState] private () {!
!

def open[T >: State <: Closed]() = !
this.asInstanceOf[Door[Open]]!
!

def stop[T >: State <: Open]() =
!
this.asInstanceOf[Door[Closed]]!
}!
!

object Door { def apply() = new Door[Closed] }
Phantom Types
Marker traits:
sealed trait DoorState!
final class Open
extends DoorState!
final class Closed extends DoorState!

class Door[State <: DoorState] private () {!
!

def open[T >: State <: Closed]() = !
this.asInstanceOf[Door[Open]]!
!

def stop[T >: State <: Open]() =
!
this.asInstanceOf[Door[Closed]]!
}!
!

object Door { def apply() = new Door[Closed] }
Phantom Types
val closed = Door()!
// closed: Door[Closed]
Phantom Types
val closed = Door()!
// closed: Door[Closed]!
!

val opened = closed.open()!
// opened: Door[Open]
Phantom Types
val closed = Door()!
// closed: Door[Closed]!
!

val opened = closed.open()!
// opened: Door[Open]!
!

val closedAgain = opened.close()!
// closedAgain: Door[Closed]!
Phantom Types
val closed = Door()!
// closed: Door[Closed]!
!

val opened = closed.open()!
// opened: Door[Open]!
!

val closedAgain = opened.close()!
// closedAgain: Door[Closed]!
!

closed.close()!
error: type arguments [Closed] do not conform to method
close's type parameter bounds [T >: Closed <: Open]
Phantom Types
val closed = Door()!
// closed: Door[Closed]!
!

val opened = closed.open()!
// opened: Door[Open]!
!

val closedAgain = opened.close()!
// closedAgain: Door[Closed]!
!

closed.close()!
error: type arguments [Closed] do not conform to method
close's type parameter bounds [T >: Closed <: Open]!
!

opened.open()!
error: type arguments [Open] do not conform to method !
open's type parameter bounds [T >: Open <: Closed]
Higher Kinded Types
Kind:

x
Proper Kind
Int!

scala> :kind -v 42!
!

scala.Int's kind is A!
*!
!

This is a proper type.
Kind: x -> x
Type Constructor
List[+A]!

scala> :kind -v List!
!

scala.collection.immutable.List's kind is F[+A]!
* -(+)-> *!
!

This is a type constructor: !
a 1st-order-kinded type.
Kind:

(x -> x) -> x
Higher Kind
import language.higherKinds!
!
class Functor[M[_]]!

scala> :kind -v Functor[List]!
!

Functor's kind is X[F[A]]!
(* -> *) -> *!
!

This is a type constructor that takes type constructor(s): !
a higher-kinded type
Higher Kinded Types

import scala.language.higherKinds!
!

takes Type Constructor

trait Functor [F[_]] {!
def map[A,B] (fn: A => B)(fa: F[A]): F[B]!
}
Higher Kinded Types
import scala.language.higherKinds!
!

trait Functor [F[_]] {!
def map[A,B] (fn: A => B)(fa: F[A]): F[B]!
}

trait Functor [List] {!
def map[Int,String] (fn: Int => String)!
(fa: List[Int]): List[String]!
}
Higher Kinded Types
import scala.language.higherKinds!
!

trait Functor [F[_]] {!
def map[A,B] (fn: A => B)(fa: F[A]): F[B]!
}

val funct = new Functor[List] {!
def map[String, Int] !
(f: String => Int)!
(fa: List[String])!
: List[Int] = fa map f // cheating ;-)!
}
Higher Kinded Types
import scala.language.higherKinds!
!

trait Functor [F[_]] {!
def map[A,B] (fn: A => B)(fa: F[A]): F[B]!
}
val funct = new Functor[List] {!
def map[String, Int] !
(f: String => Int)!
(fa: List[String]): List[Int] = !
! ! !!!
fa map f // cheating ;-)!
}
val f: Int => String = _.toString!
funct.map(f)(List(1, 2)) == List("1", "2")!
Power up: Ad-Hoc Polymorphism
trait Container[M[_]] { !
def put[A](x: A): M[A]; def get[A](m: M[A]): A !
}!
implicit val listContainer = new Container[List] { !
def put[A](x: A) = List(x)!
def get[A](m: List[A]) = m.head !
}!
!

implicit val optionContainer = new Container[Some] {!
def put[A](x: A) = Some(x);!
def get[A](m: Some[A]) = m.get !
}!
Power up: Ad-Hoc Polymorphism
trait Container[M[_]] { !
def put[A](x: A): M[A]; def get[A](m: M[A]): A !
}!

def tupleize[M[_]: Container, A, B]!
(fst: M[A], snd: M[B]) !
(implicit c: Container[M]): M[(A, B)] =
c.put(c.get(fst), c.get(snd))
tupleize(Some(1), Some(2))!
Some((1,2)): Some[(Int, Int)]!
!

tupleize(List(1), List(“2”))!
List((1,2)): List[(Int, String)]!
Power up: Ad-Hoc Polymorphism
trait Container[M[_]] { !
def put[A](x: A): M[A]; def get[A](m: M[A]): A !
}!

def tupleize[M[_]: Container, A, B]!
(fst: M[A], snd: M[B]) !
(implicit c: Container[M]): M[(A, B)] =
c.put(c.get(fst), c.get(snd))
tupleize(Some(1), Some(2))!
Some((1,2)): Some[(Int, Int)]!
!

tupleize(List(1), List(“2”))!
List((1,2)): List[(Int, String)]!
Type Class
Type Class	

A.K.A. “ad-hoc polymorphism”
Type Class	

A.K.A. “More pattern, than type”
Type Class	

A.K.A. “Stay in this room”
Type Class	

A.K.A. “Stay in this room”	

Jerzy has an entire talk about them
Type Class

// no type classes yet!
trait Writeable[Out] {!
def write: Out!
}!
!

case class Num(a: Int, b: Int) extends Writeable[Json] {!
def write = Json.toJson(this)!
}!
Type Class
trait Writes[In, Out] {
def write(in: In): Out!
}!
!
!

Separated “what” from “who”

trait Writeable[Self] {
def writeAs[Out]()!
(implicit writes: Writes[Self, Out]): Out =!
! ! ! !
writes write this!
}!
!
!
!
implicit val jsonNum = Writes[Num, Json] {!
! def write(n: Num) = Json.toJson(n)!
!
}!
!

case class Num(a: Int) extends Writeable[Num]
Type Class
trait Writes[In, Out] {
def write(in: In): Out!
}!
!
!

trait Writeable[Self] {
def writeAs[Out]()!
(implicit writes: Writes[Self, Out]): Out =!
! ! ! !
writes write this!
}!

Implicit parameter

!
!
!
implicit val jsonNum = Writes[Num, Json] {!
! def write(n: Num) = Json.toJson(n)!
!
}!
!

Implicit value

case class Num(a: Int) extends Writeable[Num]
Type Class
implicit val jsonNum = Writes[Num, Json] {
def (n1: Num, n2: Num) = n1.a < n1.!
}!
!

case class Num(a: Int) extends Writeable[Num]
Type Class
implicit val jsonNum = Writes[Num, Json] {
def (n1: Num, n2: Num) = n1.a < n1.!
}!
!

case class Num(a: Int) extends Writeable[Num]

you write:
val jsonNum = Num(12).writeAs[Json]()!
Type Class
implicit val jsonNum = Writes[Num, Json] {
def (n1: Num, n2: Num) = n1.a < n1.!
}!
!

case class Num(a: Int) extends Writeable[Num]

you write:
val jsonNum = Num(12).writeAs[Json]()!

compiler does:
val jsonNum = Num(12).writeAs[Json]()(jsonNum)!
Links & Kudos
ktoso/scala-types-of-types @ github

12444 words and growing
Other Types of Types

type annotation	

case class	

type projection 	

unified type system	

value class	

self recursive type	

bottom types	

type class	

type constructor 	

type variance	

universal trait	

specialized type	

traits	

self type annotation	

dynamic type	

type refinements	

phantom type	

existential type	

type alias	

structural type	

type lambda	

abstract type member	

 path dependent type	

 algebraic data type
Links and Kudos
http://docs.scala-lang.org/
!
http://ktoso.github.io/scala-types-of-types/	

!
!
http://blog.echo.sh/post/68636331334/experimenting-with-peano-numbers-on-scalas-type-system-1	

!
http://stackoverflow.com/questions/6246719/what-is-a-higher-kinded-type-in-scala	

!
http://twitter.github.io/scala_school/advanced-types.html	

!
https://github.com/earldouglas/scala-scratchpad/tree/master/type-lambdas	

!
http://www.scala-lang.org/old/node/136	

!
http://eed3si9n.com/learning-scalaz/polymorphism.html	

!
!
!
Dziękuję!
Thank you!
あろがとう!

(guess “type” occurrences)

K.Malawski @ ebay.com
Konrad.Malwski @ geecon.org
t: ktosopl / g: ktoso
blog: project13.pl

Lambda Days 2014 @ Kraków

More Related Content

What's hot (20)

PDF
SE 20016 - programming languages landscape.
Ruslan Shevchenko
 
PDF
07. haskell Membership
Sebastian Rettig
 
PDF
Quick swift tour
Kazunobu Tasaka
 
PDF
More expressive types for spark with frameless
Miguel Pérez Pasalodos
 
PPTX
Scala fundamentals
Alfonso Ruzafa
 
PPTX
Practically Functional
djspiewak
 
PDF
Introduction to Swift 2
Joris Timmerman
 
PPT
JavaScript Data Types
Charles Russell
 
PDF
Programming in scala - 1
Mukesh Kumar
 
PDF
Working with Cocoa and Objective-C
Kazunobu Tasaka
 
PPT
Scala uma poderosa linguagem para a jvm
Isaias Barroso
 
PPTX
Scala Refactoring for Fun and Profit
Tomer Gabel
 
PDF
Miles Sabin Introduction To Scala For Java Developers
Skills Matter
 
PDF
From android/java to swift (1)
allanh0526
 
PPTX
Scala Intro
Alexey (Mr_Mig) Migutsky
 
PDF
Ponies and Unicorns With Scala
Tomer Gabel
 
PPT
Intermediate JavaScript
☆ Milan Adamovsky ☆
 
PPT
Csharp_mahesh
Ananthu Mahesh
 
PPTX
Typeclasses
ekalyoncu
 
PDF
What can scala puzzlers teach us
Daniel Sobral
 
SE 20016 - programming languages landscape.
Ruslan Shevchenko
 
07. haskell Membership
Sebastian Rettig
 
Quick swift tour
Kazunobu Tasaka
 
More expressive types for spark with frameless
Miguel Pérez Pasalodos
 
Scala fundamentals
Alfonso Ruzafa
 
Practically Functional
djspiewak
 
Introduction to Swift 2
Joris Timmerman
 
JavaScript Data Types
Charles Russell
 
Programming in scala - 1
Mukesh Kumar
 
Working with Cocoa and Objective-C
Kazunobu Tasaka
 
Scala uma poderosa linguagem para a jvm
Isaias Barroso
 
Scala Refactoring for Fun and Profit
Tomer Gabel
 
Miles Sabin Introduction To Scala For Java Developers
Skills Matter
 
From android/java to swift (1)
allanh0526
 
Ponies and Unicorns With Scala
Tomer Gabel
 
Intermediate JavaScript
☆ Milan Adamovsky ☆
 
Csharp_mahesh
Ananthu Mahesh
 
Typeclasses
ekalyoncu
 
What can scala puzzlers teach us
Daniel Sobral
 

Viewers also liked (20)

PDF
Real-World Scala Design Patterns
NLJUG
 
PPTX
OOP - Polymorphism
Mudasir Qazi
 
PPT
The Scottish Information Literacy Project
guest9f3d11
 
PPTX
Functional Programming and Concurrency Patterns in Scala
kellogh
 
PDF
Effective Scala: Programming Patterns
Vasil Remeniuk
 
ODP
Type Parameterization
Knoldus Inc.
 
PPTX
Effective Programming In Scala
Harsh Sharma
 
PDF
Scala collections
Inphina Technologies
 
KEY
Simple Scala DSLs
linxbetter
 
PDF
So various polymorphism in Scala
b0ris_1
 
PDF
Open soucerers - jak zacząć swoją przygodę z open source
Konrad Malawski
 
PDF
JavaOne 2013: Java 8 - The Good Parts
Konrad Malawski
 
PPT
The Eff monad, one monad to rule them all
Eric Torreborre
 
PDF
Scalding - the not-so-basics @ ScalaDays 2014
Konrad Malawski
 
PDF
HBase RowKey design for Akka Persistence
Konrad Malawski
 
PDF
Need for Async: Hot pursuit for scalable applications
Konrad Malawski
 
PPTX
Scala’s implicits
Pablo Francisco Pérez Hidalgo
 
PDF
Ebay legacy-code-retreat
Konrad Malawski
 
PDF
Scala dsls-dissecting-and-implementing-rogue
Konrad Malawski
 
Real-World Scala Design Patterns
NLJUG
 
OOP - Polymorphism
Mudasir Qazi
 
The Scottish Information Literacy Project
guest9f3d11
 
Functional Programming and Concurrency Patterns in Scala
kellogh
 
Effective Scala: Programming Patterns
Vasil Remeniuk
 
Type Parameterization
Knoldus Inc.
 
Effective Programming In Scala
Harsh Sharma
 
Scala collections
Inphina Technologies
 
Simple Scala DSLs
linxbetter
 
So various polymorphism in Scala
b0ris_1
 
Open soucerers - jak zacząć swoją przygodę z open source
Konrad Malawski
 
JavaOne 2013: Java 8 - The Good Parts
Konrad Malawski
 
The Eff monad, one monad to rule them all
Eric Torreborre
 
Scalding - the not-so-basics @ ScalaDays 2014
Konrad Malawski
 
HBase RowKey design for Akka Persistence
Konrad Malawski
 
Need for Async: Hot pursuit for scalable applications
Konrad Malawski
 
Scala’s implicits
Pablo Francisco Pérez Hidalgo
 
Ebay legacy-code-retreat
Konrad Malawski
 
Scala dsls-dissecting-and-implementing-rogue
Konrad Malawski
 
Ad

Similar to Scala Types of Types @ Lambda Days (20)

PPTX
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
PPT
scala.ppt
Harissh16
 
PDF
The Great Scala Makeover
Garth Gilmour
 
PPT
Introduction to Scala for Data Science Technology
gufranqureshi506
 
PPT
Scala
Zhiwen Guo
 
PDF
Exploring type level programming in Scala
Jorge Vásquez
 
PPTX
Scala Back to Basics: Type Classes
Tomer Gabel
 
PDF
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
PDF
Scala Paradigms
Tom Flaherty
 
PDF
Generic Functional Programming with Type Classes
Tapio Rautonen
 
PDF
Scala in practice - 3 years later
patforna
 
PDF
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
Thoughtworks
 
PDF
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
PDF
TI1220 Lecture 8: Traits & Type Parameterization
Eelco Visser
 
PDF
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
Andrey Breslav
 
PDF
Types Working for You, Not Against You
C4Media
 
PDF
Java/Scala Lab 2016. Руслан Шевченко: Несколько трюков scala-разработки, приг...
GeeksLab Odessa
 
PDF
scala reloaded
Mac Liaw
 
PDF
Neal Gafter Java Evolution
deimos
 
PDF
Quark: A Purely-Functional Scala DSL for Data Processing & Analytics
John De Goes
 
Types by Adform Research, Saulius Valatka
Vasil Remeniuk
 
scala.ppt
Harissh16
 
The Great Scala Makeover
Garth Gilmour
 
Introduction to Scala for Data Science Technology
gufranqureshi506
 
Scala
Zhiwen Guo
 
Exploring type level programming in Scala
Jorge Vásquez
 
Scala Back to Basics: Type Classes
Tomer Gabel
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
Scala Paradigms
Tom Flaherty
 
Generic Functional Programming with Type Classes
Tapio Rautonen
 
Scala in practice - 3 years later
patforna
 
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
Thoughtworks
 
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
TI1220 Lecture 8: Traits & Type Parameterization
Eelco Visser
 
2022 May - Shoulders of Giants - Amsterdam - Kotlin Dev Day.pdf
Andrey Breslav
 
Types Working for You, Not Against You
C4Media
 
Java/Scala Lab 2016. Руслан Шевченко: Несколько трюков scala-разработки, приг...
GeeksLab Odessa
 
scala reloaded
Mac Liaw
 
Neal Gafter Java Evolution
deimos
 
Quark: A Purely-Functional Scala DSL for Data Processing & Analytics
John De Goes
 
Ad

More from Konrad Malawski (20)

PDF
Networks and Types - the Future of Akka @ ScalaDays NYC 2018
Konrad Malawski
 
PDF
Akka Typed (quick talk) - JFokus 2018
Konrad Malawski
 
PDF
ScalaSwarm 2017 Keynote: Tough this be madness yet theres method in't
Konrad Malawski
 
PDF
State of Akka 2017 - The best is yet to come
Konrad Malawski
 
PDF
Building a Reactive System with Akka - Workshop @ O'Reilly SAConf NYC
Konrad Malawski
 
PDF
Akka-chan's Survival Guide for the Streaming World
Konrad Malawski
 
PDF
Reactive integrations with Akka Streams
Konrad Malawski
 
PDF
Not Only Streams for Akademia JLabs
Konrad Malawski
 
PDF
Reactive Streams, j.u.concurrent & Beyond!
Konrad Malawski
 
PDF
End to End Akka Streams / Reactive Streams - from Business to Socket
Konrad Malawski
 
PDF
The Cloud-natives are RESTless @ JavaOne
Konrad Malawski
 
PDF
Akka Streams in Action @ ScalaDays Berlin 2016
Konrad Malawski
 
PDF
Krakow communities @ 2016
Konrad Malawski
 
PDF
The things we don't see – stories of Software, Scala and Akka
Konrad Malawski
 
PDF
100th SCKRK Meeting - best software engineering papers of 5 years of SCKRK
Konrad Malawski
 
PDF
[Japanese] How Reactive Streams and Akka Streams change the JVM Ecosystem @ R...
Konrad Malawski
 
PDF
Zen of Akka
Konrad Malawski
 
PDF
How Reactive Streams & Akka Streams change the JVM Ecosystem
Konrad Malawski
 
PDF
The Need for Async @ ScalaWorld
Konrad Malawski
 
PDF
Fresh from the Oven (04.2015): Experimental Akka Typed and Akka Streams
Konrad Malawski
 
Networks and Types - the Future of Akka @ ScalaDays NYC 2018
Konrad Malawski
 
Akka Typed (quick talk) - JFokus 2018
Konrad Malawski
 
ScalaSwarm 2017 Keynote: Tough this be madness yet theres method in't
Konrad Malawski
 
State of Akka 2017 - The best is yet to come
Konrad Malawski
 
Building a Reactive System with Akka - Workshop @ O'Reilly SAConf NYC
Konrad Malawski
 
Akka-chan's Survival Guide for the Streaming World
Konrad Malawski
 
Reactive integrations with Akka Streams
Konrad Malawski
 
Not Only Streams for Akademia JLabs
Konrad Malawski
 
Reactive Streams, j.u.concurrent & Beyond!
Konrad Malawski
 
End to End Akka Streams / Reactive Streams - from Business to Socket
Konrad Malawski
 
The Cloud-natives are RESTless @ JavaOne
Konrad Malawski
 
Akka Streams in Action @ ScalaDays Berlin 2016
Konrad Malawski
 
Krakow communities @ 2016
Konrad Malawski
 
The things we don't see – stories of Software, Scala and Akka
Konrad Malawski
 
100th SCKRK Meeting - best software engineering papers of 5 years of SCKRK
Konrad Malawski
 
[Japanese] How Reactive Streams and Akka Streams change the JVM Ecosystem @ R...
Konrad Malawski
 
Zen of Akka
Konrad Malawski
 
How Reactive Streams & Akka Streams change the JVM Ecosystem
Konrad Malawski
 
The Need for Async @ ScalaWorld
Konrad Malawski
 
Fresh from the Oven (04.2015): Experimental Akka Typed and Akka Streams
Konrad Malawski
 

Recently uploaded (20)

PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
July Patch Tuesday
Ivanti
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
July Patch Tuesday
Ivanti
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 

Scala Types of Types @ Lambda Days