SlideShare une entreprise Scribd logo
1  sur  91
Télécharger pour lire hors ligne
Scala @ BeJUG
 Luc Duponcheel
    ImagineJ
September 2, 2009
Introduction



  Chapter 0

 Introduction
Types




Scala is a (taste)fully typed language
Types




Scala supports generic types
Expressions




Scala is an expression oriented language
Objects




Scala is an pure object oriented language
Functions




Scala is a functional language
Scalable language



Scala is a scalable language
    Scala does not grow on a language basis
    Scala grows on a library basis
Usage



Chapter 1

 Usage
Expression evaluation: Double



scala> 1.2.*(2.3)
res0: Double = 2.76

scala> 1.2 * 2.3
res1: Double = 2.76
Expression evaluation: String



scala> "Hello world".substring(2,9)
res2: java.lang.String = llo wor

scala> "Hello world" substring (2,9)
res3: java.lang.String = llo wor
Function result




def plus(x: Int) = (y: Int) => y + x
Function result


scala> :l plus.scala
Loading plus.scala...
plus: (x: Int)(Int) => Int

scala> plus(1)
res0: (Int) => Int = <function1>
Apply plus(1)



scala> plus(1).apply(1)
res1: Int = 2

scala> plus(1)(1)
res2: Int = 2
Function parameter




def applyToZero[X](f: Int => X) = f(0)
Function parameter


scala> :l applyToZero.scala
Loading applyToZero.scala...
applyToZero: [X]((Int) => X)X

scala> applyToZero (x => x + 1)
res0: Int = 1
Function parameter and result




def twice[X](f: X => X)
 = (x: X) => f(f(x))
Function parameter and result


scala> :l twice.scala
Loading twice.scala...
twice: [X]((X) => X)(X) => X

scala> twice((x: Int) => x + 1)(0)
res0: Int = 2
Many parameter lists




def twice[X](f: X => X)(x: X) = f(f(x))
Function parameter and result


scala> :l twiceMany.scala
Loading twiceMany.scala...
twice: [X](f: (X) => X)(x: X)X

scala> twice((x: Int) => x + 1)(0)
res0: Int = 2
Placeholder syntax


scala> :l applyToZero.scala
Loading applyToZero.scala...
applyToZero: [X]((Int) => X)X

scala> applyToZero (_ + 1)
res0: Int = 1
Patterns



Chapter 2

 Patterns
Compositional reuse


Compositional reuse is reuse of
code fragments
the building blocks, starting from atomic ones
code templates
the containers into which the building blocks
can be plugged
Natural numbers and digits




type Nat = Int
type Dig = Int
Structural recursion

def structRec[A]
 (a: A, op: (Dig, A) => A) : Nat => A = {
 (n: Nat) =>
  if(n == 0) {
   a
  } else {
   op(n % 10, structRec(a, op)(n / 10))
  }
}
Using structural recursion


def sumOfDigits =
  structRec[Int](0, _ + _)

def hasDigit(d: Dig) =
  structRec[Boolean](false, _ == d || _)

def exists(p: Dig => Boolean) =
  structRec[Boolean](false, p(_) || _)
Using structural recursion


scala> sumOfDigits(1234)
res0: Int = 10

scala> hasDigit(2)(1234)
res1: Boolean = true

scala> exists(_ == 2)(1234)
res2: Boolean = true
unfoldAndThenFold

           6
 ---- | /              |
| dig = 3 + 3 = rec |
 -----------------------
        | 2 + 1           |
        |      /         |
        |    1 + 0        |
        |          /    |
        |        0      0 |
List of digits

     :
 /        
3          :
      /        
     2          :
           /        
          1          :
                /
               0
Sum of list of digits

     +
 /        
3          +
      /        
     2          +
           /        
          1          +
                /        
               0          0
Tail recursion

def tailRec[A]
 (a: A, op: (Dig, A) => A) : Nat => A = {
 (n: Nat) =>
  if(n == 0) {
   a
  } else {
   tailRec(op(n % 10, a), op)(n / 10)
  }
}
Using tail recursion


def sumOfDigits =
  tailRec[Int](0, _ + _)

def hasDigit(d: Dig) =
  tailRec[Boolean](false, _ == d || _)

def exists(p: Dig => Boolean) =
  tailRec[Boolean](false, p(_) || _)
Using tail recursion


scala> sumOfDigits(1234)
res0: Int = 10

scala> hasDigit(2)(1234)
res1: Boolean = true

scala> exists(_ == 2)(1234)
res2: Boolean = true
iterateAndAccumulate

     6 = rec
| /               |
| 0     6          |
|     /           |
|    1 + 5         |
|         ------------
|       2| + 3 = acc |
 --------| /          |
   | dig = 3 + 0      |
Control



Chapter 3

 Control
Conditional construct


def _if
 (cond: Boolean)
 (block: () => Unit)
 = cond match {
     case true => block()
     case false => ()
   }
Conditional expression


scala> :l if.scala
Loading if.scala...
_if: (Boolean)(() => Unit)Unit

scala> _if(Math.random<0.5)(() =>
     | println("ok")
     | )
ok
Loop construct


def _while
 (cond: () => Boolean)
 (block: () => Unit): Unit
 = if(cond()) {
     block()
     _while(cond)(block)
   }
Loop expression


scala> :l while.scala
Loading while.scala...
_while: (() => Boolean)(() => Unit)Unit

scala> _while(() => Math.random<0.5)(() =>
     | println ("ok")
     | )
ok
Conditional construct


def _if
 (cond: Boolean)
 (block: => Unit)
 = cond match {
     case true => block
     case false => ()
   }
Loop construct


def _while
 (cond: => Boolean)
 (block: => Unit): Unit
 = if(cond) {
     block
     _while(cond)(block)
   }
Conditional expression


scala> :l if_cbn.scala
Loading if_cbn.scala...
_if: (Boolean)(=> Unit)Unit

scala> _if(Math.random<0.5) {
     | println ("ok")
     | }
ok
Loop expression


scala> :l while_cbn.scala
Loading while_cbn.scala...
_while: (=> Boolean)(=> Unit)Unit

scala> _while(Math.random<0.5) {
     | println ("ok")
     | }
ok
Types



Chapter 4

 Types
Instance constants



class C {
 val re = 0.0
 val im = 0.0
}
Instance constants: usage


scala> :l complex01.scala
Loading complex01.scala...
defined class C

scala> new C
res0: C = C@151fe8a
toString



class C {
 // ...
 override def toString
  = re + " + " + im + "*" + "i"
}
toString: usage


scala> :l complex02.scala
Loading complex02.scala...
defined class C

scala> new C
res0: C = 0.0 + 0.0*i
Class parameters



class C(r: Double, i: Double) {
 val re = r
 val im = i
 // ...
}
Class parameters: usage


scala> :l complex03.scala
Loading complex03.scala...
defined class C

scala> new C(-1, -1)
res0: C = -1.0 + -1.0*i
toString again

override def toString = {
 val sgnim = if(im<0.0){" - "}else{" + "}
 val absim = if(im<0.0){ -im }else{ im }

 if(im == 0.0) { re + "" } else {
 if(re == 0.0) { im + "*i" } else {
 re + sgnim + absim + "*i" } }
}
toString again: usage

scala> :l complex04.scala
Loading complex04.scala...
defined class C

scala> new C(-1, -1)
res0: C = -1.0 - 1.0*i

scala> new C(-1, +1)
res1: C = -1.0 + 1.0*i
Additive operators

class C(r: Double, i: Double) {
 // ...
 def +(c: C) =
  new C(re + c.re, im + c.im)
 def -(c: C) =
  new C(re - c.re, im - c.im)
 // ...
}
Additive operators: usage

scala> :l complex05.scala
Loading complex05.scala...
defined class C

scala> new C(+1,+1) + new C(-3,+2)
res1: C = -2.0 + 3.0*i

scala> new C(+1,+1) - new C(-3,+2)
res2: C = 4.0 - 1.0*i
Multiplicative operators


// ...
def *(c: C) = new C(re*c.re - im*c.im,
 im*c.re + re*c.im)
def /(c: C) = {
 val d = c.re*c.re + c.im*c.im
 new C((re*c.re + im*c.im) / d,
  (im*c.re - re*c.im) / d) }
// ...
Multiplicative operators: usage

scala> :l complex06.scala
Loading complex06.scala...
defined class C

scala> new C(+1,+1) * new C(-3,+2)
res0: C = -5.0 - 1.0*i

scala> new C(-5,-1) / new C(-3,+2)
res1: C = 1.0 + 1.0*i
Negation operator



class C(r: Double, i: Double) {
 // ...
 def unary_- = new C(-re, -im)
 // ...
}
Negation operator: usage

scala> :l complex07.scala
Loading complex07.scala...
defined class C

scala> - new C(-5,-1)
res0: C = 5.0 + 1.0*i

scala> - new C(5,1)
res1: C = -5.0 - 1.0*i
The complex number i


class C(r: Double, i: Double) {
 // ...
}

object C {
 val i = new C(0.0, 1.0)
}
The complex number i: usage

scala> :l complex08.scala
Loading complex08.scala...
...

scala> import C.i
import C.i

scala> i * i
res0: C = -1.0
Converting Double

class C(r: Double, i: Double) {
 // ...
}

object C {
 //...
 implicit def toC(d: Double)
  = new C(d, 0.0)
}
Converting Double: usage

scala> :l complex09.scala
Loading complex09.scala...
...

scala> (1.0 + 1.0*i) / i
res0: C = 1.0 - 1.0*i

scala> 1.0 + 1.0*i / i
res1: C = 2.0
Spaces



Chapter 5

 Spaces
Space



class Space[X] extends Actor {
  // ...
}
Worker



abstract class Worker[X](space: Space[X])
 extends Actor {
  // ...
}
Work



object Types {
  type Work[X] = PartialFunction[X,Unit]
}
Put and Reg



case class Put[X](x: X)

case class Reg[X](
  work: Work[X]
  worker: Worker[X])
App




case class App[X](work: Work[X], x: X)
Space information




private var ps: List[Put[X]] = Nil
private var rs: List[Reg[X]] = Nil
Space functionality: part one



A worker can put objects x into the space
using space ! Put(x)
A worker can register work with the space
using space ! Reg(work, worker)
Space functionality: part two



A space can notify a worker when an object
x, to which the work he registered with the
space can be applied, has been put into the
space using worker ! App(work, x)
reacting to a Put: part one


case p@Put(x: X) => {
 val frs =
  rs filter(r => r.work.isDefinedAt(x)
 if(frs == Nil) {
  ps ::= p.asInstanceOf[Put[X]]
 }
reacting to a Put: part two



else {
 val fr = frs.last
 rs = rs filter (r => !(r eq fr))
 fr.worker ! App(fr.work, x)
}
reacting to a Reg: part one


case r@Reg(work, worker) => {
 val fps =
  ps filter (p => work.isDefinedAt(p.x))
 if(fps == Nil) {
  rs ::= r.asInstanceOf[Reg[X]]
 }
reacting to a Reg: part two



else {
 val fp = fps.last
 ps = ps filter (p => !(p eq fp))
 worker ! App(work, fp.x)
}
Worker: part one


abstract class Worker[X](space: Space[X])
 extends Actor {
  protected var isAcceptingMoreWork = true
  protected def registerForWork()
  def put(x: X) {
   space ! Put(x) }
  def reg(work: Work[X]) {
   space ! Reg(work, this) }
Worker: part two


private def applyZeroOrMoreTimes() {
 loop { react {
   case App(work, x) => {
    work.apply(x)
    if(isAcceptingMoreWork) {
     registerForWork()
    } } } }
}
Worker: part three



private def applyOneOrMoreTimes() {
 registerForWork()
 applyZeroOrMoreTimes()
}
Worker: part four



def act() {
 applyOneOrMoreTimes()
}
PingPong



sealed abstract class PingPong
 case object Ping extends PingPong
 case object Pong extends PingPong
 case object Over extends PingPong
 case object Done extends PingPong
Player


abstract class Player(
  name: String
  table: Space[PingPong]
)
extends Worker[PingPong](table) {
  override def toString = name
}
Pinger: part one

protected def registerForWork() =
reg {
 case Pong => {
  if (Math.random < 0.95) {
   println(this + " ping")
   put(Ping)
  } else {
   put(Over)
  }
Pinger: part two


   case Done => {
     println(this + " stop")
     isAcceptingMoreWork = false
   }
  }
 }
}
Ponger: part one

protected def registerForWork() =
reg {
 case Ping => {
  if (Math.random < 0.95) {
   println(this + " pong")
   put(Pong)
  } else {
   put(Over)
  }
Ponger: part two


   case Done => {
     println(this + " stop")
     isAcceptingMoreWork = false
   }
  }
 }
}
Umpire: part one


class Umpire(
 name: String,
 players: List[Player],
 table: Space[PingPong])
  extends Worker[PingPong](table) {
   override def toString = name
Umpire: part two

protected def registerForWork() =
reg {
  case Over => {
    println(this + " done")
    for { _ <- players } put(Done)
    println(this + " stop")
    isAcceptingMoreWork = false
  }
}
theTable



class Table extends Space[PingPong]

val theTable = new Table
thePlayers


val thePlayers =
 Pinger("pinger_1",   true) ::
 Pinger("pinger_2",   false) ::
 Ponger("ponger_1")   ::
 Ponger("ponger_2")   ::
 Nil
theUmpire



val theUmpire =
 new Umpire
  ("_umpire_", thePlayers, theTable)
main



theTable.start
thePlayers.foreach(_.start)
theUmpire.start
val startPinger = thePlayers.head
startPinger.put(Ping)

Contenu connexe

Tendances

The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final TaglessJohn De Goes
 
Functional Patterns for the non-mathematician
Functional Patterns for the non-mathematicianFunctional Patterns for the non-mathematician
Functional Patterns for the non-mathematicianBrian Lonsdorf
 
Munihac 2018 - Beautiful Template Haskell
Munihac 2018 - Beautiful Template HaskellMunihac 2018 - Beautiful Template Haskell
Munihac 2018 - Beautiful Template HaskellMatthew Pickering
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadOliver Daff
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class PatternsJohn De Goes
 
The Ring programming language version 1.3 book - Part 25 of 88
The Ring programming language version 1.3 book - Part 25 of 88The Ring programming language version 1.3 book - Part 25 of 88
The Ring programming language version 1.3 book - Part 25 of 88Mahmoud Samir Fayed
 
Scala for ruby programmers
Scala for ruby programmersScala for ruby programmers
Scala for ruby programmerstymon Tobolski
 
Collections In Scala
Collections In ScalaCollections In Scala
Collections In ScalaKnoldus Inc.
 
JavaScript Web Development
JavaScript Web DevelopmentJavaScript Web Development
JavaScript Web Developmentvito jeng
 
Scalaz 8: A Whole New Game
Scalaz 8: A Whole New GameScalaz 8: A Whole New Game
Scalaz 8: A Whole New GameJohn De Goes
 
7 Habits For a More Functional Swift
7 Habits For a More Functional Swift7 Habits For a More Functional Swift
7 Habits For a More Functional SwiftJason Larsen
 
Practical scalaz
Practical scalazPractical scalaz
Practical scalazoxbow_lakes
 
The Ring programming language version 1.5.4 book - Part 34 of 185
The Ring programming language version 1.5.4 book - Part 34 of 185The Ring programming language version 1.5.4 book - Part 34 of 185
The Ring programming language version 1.5.4 book - Part 34 of 185Mahmoud Samir Fayed
 

Tendances (20)

The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final Tagless
 
A tour of Python
A tour of PythonA tour of Python
A tour of Python
 
Millionways
MillionwaysMillionways
Millionways
 
Scala collection
Scala collectionScala collection
Scala collection
 
Reactive Collections
Reactive CollectionsReactive Collections
Reactive Collections
 
Functional Patterns for the non-mathematician
Functional Patterns for the non-mathematicianFunctional Patterns for the non-mathematician
Functional Patterns for the non-mathematician
 
Munihac 2018 - Beautiful Template Haskell
Munihac 2018 - Beautiful Template HaskellMunihac 2018 - Beautiful Template Haskell
Munihac 2018 - Beautiful Template Haskell
 
Scalaz
ScalazScalaz
Scalaz
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And Monad
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
 
The Ring programming language version 1.3 book - Part 25 of 88
The Ring programming language version 1.3 book - Part 25 of 88The Ring programming language version 1.3 book - Part 25 of 88
The Ring programming language version 1.3 book - Part 25 of 88
 
Scala for ruby programmers
Scala for ruby programmersScala for ruby programmers
Scala for ruby programmers
 
Oh Composable World!
Oh Composable World!Oh Composable World!
Oh Composable World!
 
Collections In Scala
Collections In ScalaCollections In Scala
Collections In Scala
 
JavaScript Web Development
JavaScript Web DevelopmentJavaScript Web Development
JavaScript Web Development
 
Scalaz 8: A Whole New Game
Scalaz 8: A Whole New GameScalaz 8: A Whole New Game
Scalaz 8: A Whole New Game
 
7 Habits For a More Functional Swift
7 Habits For a More Functional Swift7 Habits For a More Functional Swift
7 Habits For a More Functional Swift
 
Map, Reduce and Filter in Swift
Map, Reduce and Filter in SwiftMap, Reduce and Filter in Swift
Map, Reduce and Filter in Swift
 
Practical scalaz
Practical scalazPractical scalaz
Practical scalaz
 
The Ring programming language version 1.5.4 book - Part 34 of 185
The Ring programming language version 1.5.4 book - Part 34 of 185The Ring programming language version 1.5.4 book - Part 34 of 185
The Ring programming language version 1.5.4 book - Part 34 of 185
 

En vedette

En vedette (19)

I live in Taiwan~
I live in Taiwan~I live in Taiwan~
I live in Taiwan~
 
Annie~ouo
Annie~ouoAnnie~ouo
Annie~ouo
 
Tester
TesterTester
Tester
 
BeJUG - Di With Spring
BeJUG - Di With SpringBeJUG - Di With Spring
BeJUG - Di With Spring
 
Polly’s introduce
Polly’s introducePolly’s introduce
Polly’s introduce
 
Glass Fishv3 March2010
Glass Fishv3 March2010Glass Fishv3 March2010
Glass Fishv3 March2010
 
It’s beautiful!!!!!!!!!!!!!!!!!!
It’s beautiful!!!!!!!!!!!!!!!!!!It’s beautiful!!!!!!!!!!!!!!!!!!
It’s beautiful!!!!!!!!!!!!!!!!!!
 
Student julian
Student julianStudent julian
Student julian
 
Bad tina
Bad tinaBad tina
Bad tina
 
I live in taiwan
I live in taiwanI live in taiwan
I live in taiwan
 
Advanced Scrum
Advanced ScrumAdvanced Scrum
Advanced Scrum
 
BeJUG - Spring 3 talk
BeJUG - Spring 3 talkBeJUG - Spring 3 talk
BeJUG - Spring 3 talk
 
Programming 4 kids
Programming 4 kidsProgramming 4 kids
Programming 4 kids
 
Whats New In Java Ee 6
Whats New In Java Ee 6Whats New In Java Ee 6
Whats New In Java Ee 6
 
BeJUG JAX-RS Event
BeJUG JAX-RS EventBeJUG JAX-RS Event
BeJUG JAX-RS Event
 
BeJug.Org Java Generics
BeJug.Org   Java GenericsBeJug.Org   Java Generics
BeJug.Org Java Generics
 
EJB 3.1 by Bert Ertman
EJB 3.1 by Bert ErtmanEJB 3.1 by Bert Ertman
EJB 3.1 by Bert Ertman
 
Intro To OSGi
Intro To OSGiIntro To OSGi
Intro To OSGi
 
Kick Start Jpa
Kick Start JpaKick Start Jpa
Kick Start Jpa
 

Similaire à Scala by Luc Duponcheel

Lecture 5: Functional Programming
Lecture 5: Functional ProgrammingLecture 5: Functional Programming
Lecture 5: Functional ProgrammingEelco Visser
 
TI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsTI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsEelco Visser
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryDatabricks
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryDatabricks
 
Extractors & Implicit conversions
Extractors & Implicit conversionsExtractors & Implicit conversions
Extractors & Implicit conversionsKnoldus Inc.
 
High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance HaskellJohan Tibell
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksSeniorDevOnly
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?Tomasz Wrobel
 
JBUG 11 - Scala For Java Programmers
JBUG 11 - Scala For Java ProgrammersJBUG 11 - Scala For Java Programmers
JBUG 11 - Scala For Java ProgrammersTikal Knowledge
 
An overview of Python 2.7
An overview of Python 2.7An overview of Python 2.7
An overview of Python 2.7decoupled
 
Why Haskell Matters
Why Haskell MattersWhy Haskell Matters
Why Haskell Mattersromanandreg
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesTomer Gabel
 
Introduction to idris
Introduction to idrisIntroduction to idris
Introduction to idrisConor Farrell
 

Similaire à Scala by Luc Duponcheel (20)

Spark workshop
Spark workshopSpark workshop
Spark workshop
 
Lecture 5: Functional Programming
Lecture 5: Functional ProgrammingLecture 5: Functional Programming
Lecture 5: Functional Programming
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
TI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class FunctionsTI1220 Lecture 6: First-class Functions
TI1220 Lecture 6: First-class Functions
 
Lecture 3
Lecture 3Lecture 3
Lecture 3
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love Story
 
User Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love StoryUser Defined Aggregation in Apache Spark: A Love Story
User Defined Aggregation in Apache Spark: A Love Story
 
Extractors & Implicit conversions
Extractors & Implicit conversionsExtractors & Implicit conversions
Extractors & Implicit conversions
 
High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance Haskell
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risks
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
 
JBUG 11 - Scala For Java Programmers
JBUG 11 - Scala For Java ProgrammersJBUG 11 - Scala For Java Programmers
JBUG 11 - Scala For Java Programmers
 
Introduction to kotlin
Introduction to kotlinIntroduction to kotlin
Introduction to kotlin
 
An overview of Python 2.7
An overview of Python 2.7An overview of Python 2.7
An overview of Python 2.7
 
Why Haskell Matters
Why Haskell MattersWhy Haskell Matters
Why Haskell Matters
 
Functional object
Functional objectFunctional object
Functional object
 
Scala Back to Basics: Type Classes
Scala Back to Basics: Type ClassesScala Back to Basics: Type Classes
Scala Back to Basics: Type Classes
 
Introduction to idris
Introduction to idrisIntroduction to idris
Introduction to idris
 
Array
ArrayArray
Array
 

Plus de Stephan Janssen

Devoxx speaker training (June 27th, 2018)
Devoxx speaker training (June 27th, 2018)Devoxx speaker training (June 27th, 2018)
Devoxx speaker training (June 27th, 2018)Stephan Janssen
 
The new DeVoxxEd websites with JHipster, Angular & Kubernetes
The new DeVoxxEd websites with JHipster, Angular & KubernetesThe new DeVoxxEd websites with JHipster, Angular & Kubernetes
The new DeVoxxEd websites with JHipster, Angular & KubernetesStephan Janssen
 
The new Voxxed websites with JHipster, Angular and GitLab
The new Voxxed websites  with JHipster, Angular and GitLabThe new Voxxed websites  with JHipster, Angular and GitLab
The new Voxxed websites with JHipster, Angular and GitLabStephan Janssen
 
Devoxx2011 timesheet day3-4-5
Devoxx2011 timesheet day3-4-5Devoxx2011 timesheet day3-4-5
Devoxx2011 timesheet day3-4-5Stephan Janssen
 
Devoxx2011 timesheet day1-2
Devoxx2011 timesheet day1-2Devoxx2011 timesheet day1-2
Devoxx2011 timesheet day1-2Stephan Janssen
 

Plus de Stephan Janssen (6)

Devoxx speaker training (June 27th, 2018)
Devoxx speaker training (June 27th, 2018)Devoxx speaker training (June 27th, 2018)
Devoxx speaker training (June 27th, 2018)
 
The new DeVoxxEd websites with JHipster, Angular & Kubernetes
The new DeVoxxEd websites with JHipster, Angular & KubernetesThe new DeVoxxEd websites with JHipster, Angular & Kubernetes
The new DeVoxxEd websites with JHipster, Angular & Kubernetes
 
The new Voxxed websites with JHipster, Angular and GitLab
The new Voxxed websites  with JHipster, Angular and GitLabThe new Voxxed websites  with JHipster, Angular and GitLab
The new Voxxed websites with JHipster, Angular and GitLab
 
Java, what's next?
Java, what's next?Java, what's next?
Java, what's next?
 
Devoxx2011 timesheet day3-4-5
Devoxx2011 timesheet day3-4-5Devoxx2011 timesheet day3-4-5
Devoxx2011 timesheet day3-4-5
 
Devoxx2011 timesheet day1-2
Devoxx2011 timesheet day1-2Devoxx2011 timesheet day1-2
Devoxx2011 timesheet day1-2
 

Dernier

A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphThiyagu K
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpinRaunakKeshri1
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactdawncurless
 
9548086042 for call girls in Indira Nagar with room service
9548086042  for call girls in Indira Nagar  with room service9548086042  for call girls in Indira Nagar  with room service
9548086042 for call girls in Indira Nagar with room servicediscovermytutordmt
 
Measures of Dispersion and Variability: Range, QD, AD and SD
Measures of Dispersion and Variability: Range, QD, AD and SDMeasures of Dispersion and Variability: Range, QD, AD and SD
Measures of Dispersion and Variability: Range, QD, AD and SDThiyagu K
 
fourth grading exam for kindergarten in writing
fourth grading exam for kindergarten in writingfourth grading exam for kindergarten in writing
fourth grading exam for kindergarten in writingTeacherCyreneCayanan
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
Beyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactBeyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactPECB
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAssociation for Project Management
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfciinovamais
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationnomboosow
 
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...fonyou31
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Celine George
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Krashi Coaching
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxVishalSingh1417
 
Introduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsIntroduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsTechSoup
 

Dernier (20)

A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot Graph
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpin
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impact
 
9548086042 for call girls in Indira Nagar with room service
9548086042  for call girls in Indira Nagar  with room service9548086042  for call girls in Indira Nagar  with room service
9548086042 for call girls in Indira Nagar with room service
 
Measures of Dispersion and Variability: Range, QD, AD and SD
Measures of Dispersion and Variability: Range, QD, AD and SDMeasures of Dispersion and Variability: Range, QD, AD and SD
Measures of Dispersion and Variability: Range, QD, AD and SD
 
fourth grading exam for kindergarten in writing
fourth grading exam for kindergarten in writingfourth grading exam for kindergarten in writing
fourth grading exam for kindergarten in writing
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
Beyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactBeyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global Impact
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across Sectors
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communication
 
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptx
 
Introduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The BasicsIntroduction to Nonprofit Accounting: The Basics
Introduction to Nonprofit Accounting: The Basics
 

Scala by Luc Duponcheel