Modular rollback through free monads Conor McBride, Olin Shivers, - - PowerPoint PPT Presentation

modular rollback through free monads
SMART_READER_LITE
LIVE PREVIEW

Modular rollback through free monads Conor McBride, Olin Shivers, - - PowerPoint PPT Presentation

Modular rollback through free monads Conor McBride, Olin Shivers, Aaron Turon Tuesday, September 27, 2011 Goals for this talk Illustrate modular rollback with side-effects Brief tutorial on: free monads Filinskis monadic


slide-1
SLIDE 1

Modular rollback through free monads

Conor McBride, Olin Shivers, Aaron Turon

Tuesday, September 27, 2011

slide-2
SLIDE 2

Goals for this talk

  • Illustrate modular rollback with side-effects
  • Brief tutorial on:
  • free monads
  • Filinski’s monadic representation
  • Derive modular rollback from these tools
  • Non-goal: showing significant new research

Tuesday, September 27, 2011

slide-3
SLIDE 3

DEMO

Tuesday, September 27, 2011

slide-4
SLIDE 4

datatype sexp = Atom of string | Cons of sexp * sexp | Nil val peek: unit -> char val nom: unit -> unit val abort: unit -> 'a

Tuesday, September 27, 2011

slide-5
SLIDE 5

(* sexp: unit -> SExp *) fun sexp() = case peek()

  • f #"." => abort()

| #")" => abort() | #"(" => (nom(); openP()) | #" " => (nom(); sexp()) | _ => Atom (atom())

Tuesday, September 27, 2011

slide-6
SLIDE 6

val peek: unit -> char val nom: unit -> unit val abort: unit -> 'a

We use effectful operations:

Tuesday, September 27, 2011

slide-7
SLIDE 7

signature READLINE = sig end

Step 1: parameterize

val peek: unit -> char val nom: unit -> unit val abort: unit -> 'a

Tuesday, September 27, 2011

slide-8
SLIDE 8

signature READLINE = sig end functor Parser(R: READLINE) = ... val parse: unit -> sexp

Step 1: parameterize

val peek: unit -> char val nom: unit -> unit val abort: unit -> 'a

Tuesday, September 27, 2011

slide-9
SLIDE 9

A monad has: return bind effectful operations Free monads treat these syntactically

Tuesday, September 27, 2011

slide-10
SLIDE 10

peek: nom: abort: unit -> unit -> unit -> char unit

α

Tuesday, September 27, 2011

slide-11
SLIDE 11

peek: nom: abort: readline readline readline char unit

α

Tuesday, September 27, 2011

slide-12
SLIDE 12

readline readline readline char unit

α

Peek: Nom: Abort:

Tuesday, September 27, 2011

slide-13
SLIDE 13

readline readline readline char unit

α

Return: α -> α readline Bind: α readline

  • > (α -> β readline)
  • > β readline

Peek: Nom: Abort:

Tuesday, September 27, 2011

slide-14
SLIDE 14

(* atom: unit -> string *) fun atom() = case peek()

  • f (#" " | #"." | #"(" | #")") => ""

| c => (nom(); c ^ atom())

Tuesday, September 27, 2011

slide-15
SLIDE 15

(* atom: unit -> string *) fun atom() = case peek()

  • f (#" " | #"." | #"(" | #")") => ""

| c => (nom(); c ^ atom())

Tuesday, September 27, 2011

slide-16
SLIDE 16

(* atom: string readline *) val atom = case peek()

  • f (#" " | #"." | #"(" | #")") => ""

| c => (nom(); c ^ atom())

Tuesday, September 27, 2011

slide-17
SLIDE 17

(* atom: string readline *) val atom = Bind Peek (fn c => case c

  • f (#" " | #"." | #"(" | #")") => ""

| _ => (nom(); c ^ atom()))

Tuesday, September 27, 2011

slide-18
SLIDE 18

(* atom: string readline *) val atom = Bind Peek (fn c => case c

  • f (#" " | #"." | #"(" | #")") =>

Return "" | _ => (nom(); c ^ atom()))

Tuesday, September 27, 2011

slide-19
SLIDE 19

(* atom: string readline *) val atom = Bind Peek (fn c => case c

  • f (#" " | #"." | #"(" | #")") =>

Return "" | _ => Bind Nom (fn () => Bind atom (fn s => Return (c ^ s))))

Tuesday, September 27, 2011

slide-20
SLIDE 20

reify: α [readline] -> α readline reify c = reset (fn () => Return c)

Reify delimits your monadic computation

Tuesday, September 27, 2011

slide-21
SLIDE 21

reflect: α readline -> α [readline] reflect v = shift (fn k => Bind v k)

Reflect: to do an effect, put a bind between you and your continuation

Tuesday, September 27, 2011

slide-22
SLIDE 22

val peek: unit -> char val nom: unit -> unit val abort: unit -> 'a

Step 2: monadic reflection

Tuesday, September 27, 2011

slide-23
SLIDE 23

fun peek() = shift (fn k => Bind Peek k) fun nom() = shift (fn k => Bind Nom k) fun abort() = shift (fn k => Bind Abort k)

Step 2: monadic reflection

Tuesday, September 27, 2011

slide-24
SLIDE 24

fun peek() = shift (fn k => Bind Peek k) fun nom() = shift (fn k => Bind Nom k) fun abort() = shift (fn k => Bind Abort k)

Step 2: monadic reflection

val Parse: sexp readline val Parse = reset parse

Tuesday, September 27, 2011

slide-25
SLIDE 25

interp: 'a readline -> string -> ('a * string) option fun interp (Return x) s = SOME(x, s) | interp (Bind f k) s = case f s

  • f SOME (a, s') => k a s'

| NONE => NONE | interp Peek s = if isEmpty(s) then NONE else SOME(sub s 0, s) | interp Nom s = if isEmpty(s) then NONE else SOME((), triml 1 s) | interp Abort s = NONE

Tuesday, September 27, 2011

slide-26
SLIDE 26

Putc: char -> unit tty Getc: char tty Return: α -> α tty Bind: α tty -> (α -> β tty)

  • > β tty

The TTY Monad

Tuesday, September 27, 2011

slide-27
SLIDE 27

Step 3: Monad Mapping

datatype α stk = PEEK of (α stk) (char -> α readline) | NOM of α stk | ROOT of α readline val driver: α stk -> α readline -> char option -> α tty

Tuesday, September 27, 2011

slide-28
SLIDE 28

driver stk (Return x) _ = TTY.Return x

Tuesday, September 27, 2011

slide-29
SLIDE 29

driver stk (Return x) _ = TTY.Return x driver stk (Bind Peek k) NONE = TTY.Bind Getc (fn c => case c of #”\b” => pop stk _ => driver (PEEK stk k) (k c) (SOME c)

Tuesday, September 27, 2011

slide-30
SLIDE 30

driver stk (Return x) _ = TTY.Return x driver stk (Bind Peek k) NONE = TTY.Bind Getc (fn c => case c of #”\b” => pop stk _ => driver (PEEK stk k) (k c) (SOME c) driver stk (Bind Peek k) (SOME c) = driver stk (k c) (SOME c)

Tuesday, September 27, 2011

slide-31
SLIDE 31

driver stk (Return x) _ = TTY.Return x driver stk (Bind Peek k) NONE = TTY.Bind Getc (fn c => case c of #”\b” => pop stk _ => driver (PEEK stk k) (k c) (SOME c) driver stk (Bind Peek k) (SOME c) = driver stk (k c) (SOME c) driver stk (Bind Nom k) (SOME c) = Putc c >> driver (NOM stk) (k ()) NONE

Tuesday, September 27, 2011

slide-32
SLIDE 32

driver stk (Return x) _ = TTY.Return x driver stk (Bind Peek k) NONE = TTY.Bind Getc (fn c => case c of #”\b” => pop stk _ => driver (PEEK stk k) (k c) (SOME c) driver stk (Bind Peek k) (SOME c) = driver stk (k c) (SOME c) driver stk (Bind Nom k) (SOME c) = Putc c >> driver (NOM stk) (k ()) NONE driver stk (Bind Abort _) _ = pop stk

Tuesday, September 27, 2011

slide-33
SLIDE 33

val pop: α Stk -> α tty pop (PEEK stk k) = driver stk (Bind Peek k) NONE pop (NOM stk) = Putc #”\b” >> Putc #” ” >> Putc #”\b” >> pop stk pop (ROOT r) = driver (ROOT r) r NONE

Tuesday, September 27, 2011

slide-34
SLIDE 34
  • The shift/reset in the pearl is just monadic

representation

  • Filinski’s technique is useful for sneaking in

unexpected effects

Conclusion

Tuesday, September 27, 2011