SlideShare uma empresa Scribd logo
1 de 91
Baixar para ler offline
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)

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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
 

Destaque

Destaque (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
 

Semelhante a 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
 

Semelhante a 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
 

Mais 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
 

Mais 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
 

Último

How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17Celine George
 
ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701bronxfugly43
 
How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17Celine George
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.christianmathematics
 
Single or Multiple melodic lines structure
Single or Multiple melodic lines structureSingle or Multiple melodic lines structure
Single or Multiple melodic lines structuredhanjurrannsibayan2
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...christianmathematics
 
Unit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptxUnit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptxVishalSingh1417
 
ICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptxICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptxAreebaZafar22
 
Micro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfMicro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfPoh-Sun Goh
 
Application orientated numerical on hev.ppt
Application orientated numerical on hev.pptApplication orientated numerical on hev.ppt
Application orientated numerical on hev.pptRamjanShidvankar
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfAdmir Softic
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfagholdier
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxVishalSingh1417
 
Unit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptxUnit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptxVishalSingh1417
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxheathfieldcps1
 
Google Gemini An AI Revolution in Education.pptx
Google Gemini An AI Revolution in Education.pptxGoogle Gemini An AI Revolution in Education.pptx
Google Gemini An AI Revolution in Education.pptxDr. Sarita Anand
 
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17  How to Extend Models Using Mixin ClassesMixin Classes in Odoo 17  How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17 How to Extend Models Using Mixin ClassesCeline George
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdfQucHHunhnh
 

Último (20)

How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17
 
ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701
 
How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.
 
Single or Multiple melodic lines structure
Single or Multiple melodic lines structureSingle or Multiple melodic lines structure
Single or Multiple melodic lines structure
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
 
Unit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptxUnit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptx
 
ICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptxICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptx
 
Micro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfMicro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdf
 
Application orientated numerical on hev.ppt
Application orientated numerical on hev.pptApplication orientated numerical on hev.ppt
Application orientated numerical on hev.ppt
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdf
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdf
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptx
 
Unit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptxUnit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptx
 
Spatium Project Simulation student brief
Spatium Project Simulation student briefSpatium Project Simulation student brief
Spatium Project Simulation student brief
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptx
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
Google Gemini An AI Revolution in Education.pptx
Google Gemini An AI Revolution in Education.pptxGoogle Gemini An AI Revolution in Education.pptx
Google Gemini An AI Revolution in Education.pptx
 
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17  How to Extend Models Using Mixin ClassesMixin Classes in Odoo 17  How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
 

Scala by Luc Duponcheel