data made out of - - PowerPoint PPT Presentation

data made
SMART_READER_LITE
LIVE PREVIEW

data made out of - - PowerPoint PPT Presentation

data made out of functions #ylj2016 For faster @KenScambler monads!


slide-1
SLIDE 1

data made

  • ut of

functions

#ylj2016 @KenScambler

λλλλλ λλ λλ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λλλλ λ λ λ λλ λλ λλλλλ

For faster monads!

slide-2
SLIDE 2

Diogenes of Sinope 412 – 323 BC

slide-3
SLIDE 3

Diogenes of Sinope 412 – 323 BC

  • Simplest man of all time
  • Obnoxious hobo
  • Lived in a barrel
slide-4
SLIDE 4

I’ve been using this bowl like a sucker!

slide-5
SLIDE 5
slide-6
SLIDE 6
slide-7
SLIDE 7

Um…. what

slide-8
SLIDE 8

"abcd" IF x THEN y ELSE z WHILE cond {…} [a, b, c, d] BOOL INT STRUCT { fields… } λa -> b

slide-9
SLIDE 9

IF x THEN y ELSE z WHILE cond {…} [a, b, c, d] BOOL INT STRUCT { fields… } λa -> b

Strings are pretty much arrays

slide-10
SLIDE 10

IF x THEN y ELSE z [a, b, c, d] BOOL INT STRUCT { fields… } λa -> b

Recursion can do loops

slide-11
SLIDE 11

IF x THEN y ELSE z [a,b,c,d] BOOL INT STRUCT { fields… } λa -> b

Recursive data structures can do lists

slide-12
SLIDE 12

IF x THEN y ELSE z [a,b,c,d] INT STRUCT { fields… } λa -> b

Ints can do bools

slide-13
SLIDE 13

IF x THEN y ELSE z [a,b,c,d] INT STRUCT { fields… } λa -> b

slide-14
SLIDE 14

[a,b,c,d] STRUCT

λa -> b

slide-15
SLIDE 15

Alonzo Church 1903 - 1995

λa -> b Lambda calculus

slide-16
SLIDE 16

λa -> b

Alonzo Church 1903 - 1995

Lambda calculus

slide-17
SLIDE 17

We can make any data structure out of functions!

Church encoding

slide-18
SLIDE 18

Booleans

Bool

slide-19
SLIDE 19

Church booleans

result

Bool

slide-20
SLIDE 20

Church booleans

result

Bool

If we define everything you can do with a structure, isn’t that the same as defining the structure itself?

slide-21
SLIDE 21

TRUE FALSE

  • r
slide-22
SLIDE 22

TRUE FALSE

  • r

result “What we do if it’s true”

slide-23
SLIDE 23

“What we do if it’s false”

TRUE FALSE

  • r

result

slide-24
SLIDE 24

TRUE FALSE

  • r

result result result

slide-25
SLIDE 25

() ()

result result result

slide-26
SLIDE 26

result result result

slide-27
SLIDE 27

r r r

The Church encoding

  • f a boolean is:
slide-28
SLIDE 28

type pe CBool = forall forall r. r -> r -> r cT cTrue ue :: :: CBoo CBool cTrue x y = x cFals alse :: : CBo CBool

  • l

cFalse x y = y cNot

  • t ::

:: CBool CBool -> > CBool

  • ol

cNot cb = cb cFalse cTrue cAnd nd :: :: CBool CBool -> > CBool

  • ol ->

> CBo Bool cAnd cb1 cb2 = cb1 cb2 cFalse cOr cOr :: : CBool Bool -> > CBo CBool

  • l ->

> CBool

  • ol

cOr cb1 cb2 = cb1 cTrue cb2

slide-29
SLIDE 29

Natural numbers

1 2 3 4 …

slide-30
SLIDE 30

Natural numbers

0 +1 0 +1 +1 0 +1 +1 +1 0 +1 +1 +1 +1 …

slide-31
SLIDE 31

Natural numbers

0 +1 0 +1 +1 0 +1 +1 +1 0 +1 +1 +1 +1 …

Giuseppe Peano 1858 - 1932

Natural numbers form a data structure!

slide-32
SLIDE 32

Zero Succ(Nat)

  • r

Nat = Natural Peano numbers

Giuseppe Peano 1858 - 1932

slide-33
SLIDE 33
  • r

Nat =

Now lets turn it into functions!

Zero Succ(Nat)

slide-34
SLIDE 34

Zero Succ(Nat)

  • r

result “If it’s a successor”

slide-35
SLIDE 35
  • r

“If it’s zero” result

Zero Succ(Nat)

slide-36
SLIDE 36

result result result

  • r

Zero Succ(Nat)

slide-37
SLIDE 37

Nat ()

result result result

slide-38
SLIDE 38

Nat

result result result

slide-39
SLIDE 39

Nat

result result result () Nat

() Nat

() Nat

() Nat

slide-40
SLIDE 40

result result result result

slide-41
SLIDE 41

(r r) r

The Church encoding

  • f natural numbers is:

r

slide-42
SLIDE 42

type pe CNat = forall ll r. (r -> r) -> r -> r c0 c0, c c1, , c2, c 2, c3, , c4 4 :: : CN CNat c0 f z = z c1 f z = f z c2 f z = f (f z) c3 f z = f (f (f z)) c4 f z = f (f (f (f z))) cSucc ucc :: :: CNat Nat -> > CNat at cSucc cn f = f . cn f cPlus lus :: :: CNat Nat -> > CNat at -> > CNat at cPlus cn1 cn2 f = cn1 f . cn2 f cMult ult :: :: CNat Nat -> > CNat at -> > CNat at cMult cn1 cn2 = cn1 . cn2

slide-43
SLIDE 43

type pe CNat = forall ll r. (r -> r) -> r -> r c0 c0, c c1, , c2, c 2, c3, , c4 4 :: : CN CNat c0 f = id c1 f = f c2 f = f . f c3 f = f . f . f c4 f = f . f . f . f cSucc ucc :: :: CNat Nat -> > CNat at cSucc cn f = f . cn f cPlus lus :: :: CNat Nat -> > CNat at -> > CNat at cPlus cn1 cn2 f = cn1 f . cn2 f cMult ult :: :: CNat Nat -> > CNat at -> > CNat at cMult cn1 cn2 = cn1 . cn2

slide-44
SLIDE 44

Performance

Native ints Peano numbers Church numbers addition print O(n) O(n2) multiplication O(n) O(n) O(1) O(1)

slide-45
SLIDE 45

Performance

Native ints Peano numbers Church numbers addition print O(n) O(n2) multiplication O(n) O(n) O(1) O(1)

slide-46
SLIDE 46

Church encoding cheat sheet

A | B (A, B) Singleton Recursion

(a r) (b r) r (a r) b r r r r

A

a r

slide-47
SLIDE 47

Nil Cons(a, List a)

  • r

List a = Cons lists

slide-48
SLIDE 48

Nil Cons(a, List a)

  • r

result result result

slide-49
SLIDE 49

(a, List a)

result result result

()

slide-50
SLIDE 50

(a, )

result result result result

slide-51
SLIDE 51

a

result result result result

slide-52
SLIDE 52

r r

The Church encoding

  • f lists is:

r (a ) r

slide-53
SLIDE 53

r r

The Church encoding

  • f lists is:

r (a ) r

AKA: foldr

slide-54
SLIDE 54

Functors

a

slide-55
SLIDE 55

Functors

f a a

slide-56
SLIDE 56

Functors

f (f a) They compose! f a a

slide-57
SLIDE 57

Functors

f (f (f a)) What if we make a “Church numeral” out of them? f (f a) f a a

slide-58
SLIDE 58

Free monads

f (f (f (f a))) f (f (f a)) f (f a) f a a

slide-59
SLIDE 59

Free monad >>=

a

slide-60
SLIDE 60

Free monad >>=

a

fmap

slide-61
SLIDE 61

Free monad >>=

f a

slide-62
SLIDE 62

Free monad >>=

f a

fmap

slide-63
SLIDE 63

Free monad >>=

f a

fmap

slide-64
SLIDE 64

Free monad >>=

f (f a)

slide-65
SLIDE 65

Free monad >>=

f (f a)

fmap

slide-66
SLIDE 66

Free monad >>=

f (f a)

fmap

slide-67
SLIDE 67

Free monad >>=

f (f a)

fmap

slide-68
SLIDE 68

Free monad >>=

f (f (f a))

slide-69
SLIDE 69

Free monad >>=

f (f (f a))

fmap

slide-70
SLIDE 70

Free monad >>=

f (f (f a))

fmap

slide-71
SLIDE 71

Free monad >>=

f (f (f a))

fmap

slide-72
SLIDE 72

Free monad >>=

f (f (f a))

fmap

slide-73
SLIDE 73

λn  [n+1, n*2]

3

slide-74
SLIDE 74

λn  [n+1, n*2]

4 6

slide-75
SLIDE 75

λn  [n+1, n*2]

4 6

fmap

slide-76
SLIDE 76

λn  [n+1, n*2]

5 8 7 12

slide-77
SLIDE 77

λn  [n+1, n*2]

5 8 7 12

fmap

slide-78
SLIDE 78

λn  [n+1, n*2]

5 8 7 12

fmap

slide-79
SLIDE 79

λn  [n+1, n*2]

6 10 9 16 8 14 13 24

slide-80
SLIDE 80

λn  Wrap [Pure (n+1), Pure (n*2)]

3

slide-81
SLIDE 81

λn  Wrap [Pure (n+1), Pure (n*2)]

>>= 3

slide-82
SLIDE 82

4 6

λn  Wrap [Pure (n+1), Pure (n*2)]

slide-83
SLIDE 83

4 6

λn  Wrap [Pure (n+1), Pure (n*2)]

>>=

slide-84
SLIDE 84

4 6

λn  Wrap [Pure (n+1), Pure (n*2)]

fmap

slide-85
SLIDE 85

4 6

λn  Wrap [Pure (n+1), Pure (n*2)]

>>=

slide-86
SLIDE 86

λn  Wrap [Pure (n+1), Pure (n*2)]

5 8 7 12

slide-87
SLIDE 87

λn  Wrap [Pure (n+1), Pure (n*2)]

5 8 7 12 >>=

slide-88
SLIDE 88

λn  Wrap [Pure (n+1), Pure (n*2)]

5 8 7 12 fmap

slide-89
SLIDE 89

λn  Wrap [Pure (n+1), Pure (n*2)]

5 8 7 12 >>=

slide-90
SLIDE 90

λn  Wrap [Pure (n+1), Pure (n*2)]

5 8 7 12 fmap

slide-91
SLIDE 91

λn  Wrap [Pure (n+1), Pure (n*2)]

>>= 5 8 7 12

slide-92
SLIDE 92

λn  Wrap [Pure (n+1), Pure (n*2)]

6 10 9 16 8 14 13 24

slide-93
SLIDE 93

Pure a Wrap f (Free f a)

  • r

Free a = Free monads

slide-94
SLIDE 94

Pure a Wrap f (Free f a)

  • r

result result result

slide-95
SLIDE 95

f (Free f a)

result result result

a

slide-96
SLIDE 96

f

result result result

a

result

slide-97
SLIDE 97

r r

The Church encoding

  • f free monads is:

(f ) r r (a )

slide-98
SLIDE 98

r r (f ) r r (a )

>>=

CFree f b

Bind is constant time!

slide-99
SLIDE 99

λa -> b

slide-100
SLIDE 100

λa -> b ∴

slide-101
SLIDE 101

λa -> b ∴