Ornaments in Practice Thomas Williams , Pierre-variste Dagand, Didier - - PowerPoint PPT Presentation

ornaments in practice
SMART_READER_LITE
LIVE PREVIEW

Ornaments in Practice Thomas Williams , Pierre-variste Dagand, Didier - - PowerPoint PPT Presentation

Ornaments in Practice Thomas Williams , Pierre-variste Dagand, Didier Rmy Inria August 29, 2014 Motivation Very similar data structures expressed as algebraic data types: trees with values at the leaves, at the nodes, etc GADTs


slide-1
SLIDE 1

Ornaments in Practice

Thomas Williams, Pierre-Évariste Dagand, Didier Rémy

Inria

August 29, 2014

slide-2
SLIDE 2

Motivation

Very similar data structures expressed as algebraic data types:

◮ trees with values at the leaves, at the nodes, etc ◮ GADTs encoding different invariants

Very similar functions on these structures

slide-3
SLIDE 3

Motivation

Very similar data structures expressed as algebraic data types:

◮ trees with values at the leaves, at the nodes, etc ◮ GADTs encoding different invariants

Very similar functions on these structures Ornaments (McBride,2010)

◮ express the link between similar datatypes ◮ between operations on these types

slide-4
SLIDE 4

Naturals and lists

type nat = Z | S of nat type α list = Nil | Cons of α × α list

slide-5
SLIDE 5

Naturals and lists

type nat = Z | S of nat type α list = Nil | Cons of α × α list S ( S ( S ( Z ))) Cons(1, Cons(2, Cons(3, Nil)))

slide-6
SLIDE 6

Naturals and lists

type nat = Z | S of nat type α list = Nil | Cons of α × α list S ( S ( S ( Z ))) Cons(1, Cons(2, Cons(3, Nil)))

Projection function:

let rec length = function | Nil → Z | Cons(x, xs) → S(length xs)

  • rnament from length : α list → nat
slide-7
SLIDE 7

Valid ornaments

Intuitively, an ornament match values from an ornamented datatype to values of a bare type.

◮ Project the constructors from the ornamented to the bare type ◮ maybe forget some information ◮ while keeping the recursive structure of the value

An ornament is defined by a projection function, subject to some syntactic conditions described in our paper.

slide-8
SLIDE 8

Relating functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons(x,append ml’ nl)

Coherence:

length (append ml nl) = add (length ml) (length nl) project (f_lifted x y) = f (project x) (project y)

slide-9
SLIDE 9

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n)

slide-10
SLIDE 10

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length}

slide-11
SLIDE 11

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length}

slide-12
SLIDE 12

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl =

slide-13
SLIDE 13

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = length ml = m length nl = n

slide-14
SLIDE 14

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = length ml = m length nl = n

slide-15
SLIDE 15

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match with length ml = m length nl = n

slide-16
SLIDE 16

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match with length ml = m length nl = n

slide-17
SLIDE 17

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with length ml = m length nl = n

slide-18
SLIDE 18

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with length ml = m length nl = n

slide-19
SLIDE 19

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → length ml = m length nl = n

slide-20
SLIDE 20

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → length ml = m length nl = n

slide-21
SLIDE 21

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl length ml = m length nl = n

slide-22
SLIDE 22

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl length ml = m length nl = n

slide-23
SLIDE 23

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → length ml = m length nl = n length ml’ = m’

slide-24
SLIDE 24

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → length ml = m length nl = n length ml’ = m’

slide-25
SLIDE 25

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons( , ) length ml = m length nl = n length ml’ = m’

slide-26
SLIDE 26

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons( , ) length ml = m length nl = n length ml’ = m’

slide-27
SLIDE 27

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons( , append ml’ nl) length ml = m length nl = n length ml’ = m’

slide-28
SLIDE 28

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons(???, append ml’ nl) length ml = m length nl = n length ml’ = m’

slide-29
SLIDE 29

Lifting functions

let rec add m n = match m with | Z → n | S m’ → S (add m’ n) let lifting append from add with {length} → {length} → {length} let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons(x, append ml’ nl) length ml = m length nl = n length ml’ = m’

slide-30
SLIDE 30

Filling the missing part

let rec append ml nl = match ml with | Nil → nl | Cons(x,ml’) → Cons( ? , append ml’ nl)

◮ Manually, by intervention of the programmer ◮ With a patch specifying what should be added where ◮ Code inference: x makes the most sense here

slide-31
SLIDE 31

The other liftings

length (add_lifted ml nl) = add (length ml) (length nl) let rec rev_append ml nl = match ml with | Nil → nl | Cons(x,ml’) → rev_append ml’ (Cons(x,nl)) let rec add_bis m n = match m with | Z → n | S m’ → add_bis m’ (S n)

slide-32
SLIDE 32

Ornaments for refactoring

type expr = | Const of int | Add of expr × expr | Mul of expr × expr let rec eval = function | Const(i) → i | Add(u, v) → eval u + eval v | Mul(u, v) → eval u × eval v

slide-33
SLIDE 33

Ornaments for refactoring

type expr = | Const of int | Add of expr × expr | Mul of expr × expr let rec eval = function | Const(i) → i | Add(u, v) → eval u + eval v | Mul(u, v) → eval u × eval v type binop = Add’ | Mul’ type expr’ = | Const’ of int | BinOp’ of binop × expr’ × expr’

slide-34
SLIDE 34

Ornaments for refactoring (2)

let rec convert : expr’ → expr = function | Const’(i) → Const(i) | BinOp(Add’, u, v) → Add(convert u, convert v) | BinOp(Mul’, u, v) → Mul(convert u, convert v)

  • rnament from convert : expr’ → expr

let lifting eval’ from eval with {convert} → _

The projection convert is bijective: the lifting is uniquely defined.

slide-35
SLIDE 35

Ornaments for refactoring (2)

let rec convert : expr’ → expr = function | Const’(i) → Const(i) | BinOp(Add’, u, v) → Add(convert u, convert v) | BinOp(Mul’, u, v) → Mul(convert u, convert v)

  • rnament from convert : expr’ → expr

let lifting eval’ from eval with {convert} → _

The projection convert is bijective: the lifting is uniquely defined.

let rec eval’ : expr’ → int = function | Const’(i) → i | BinOp’(Add’, u, v) → eval’ u + eval’ v | BinOp’(Mul’, u, v) → eval’ u × eval’ v

slide-36
SLIDE 36

Lifting data structures

type key val compare : key → key → int type set = Empty | Node of key × set × set type α map = | MEmpty | MNode of key × α × α map × α map let rec keys = function | MEmpty → Empty | MNode(k, v, l, r) → Node(k, keys l, keys r)

  • rnament from keys : α map → set
slide-37
SLIDE 37

Lifting an higher-order function

let rec exists (p : elt → bool) (s : set) : bool = match s with | Empty → false | Node(l, k, r) → p k || exists p l || exists p r

slide-38
SLIDE 38

Lifting an higher-order function

let rec exists (p : elt → bool) (s : set) : bool = match s with | Empty → false | Node(l, k, r) → p k || exists p l || exists p r let lifting map_exists from exists with (_ → +_ → _) → {keys} → _

slide-39
SLIDE 39

Lifting an higher-order function

let rec exists (p : elt → bool) (s : set) : bool = match s with | Empty → false | Node(l, k, r) → p k || exists p l || exists p r let lifting map_exists from exists with (_ → +_ → _) → {keys} → _ let rec map_exists p m = match m with | Empty → false | Node(l, k, v, r) → p k ? || map_exists p l || map_exists p r

slide-40
SLIDE 40

GADTs

Several data structures with the same contents but different invariants, i.e. a constraint on the shape of the type. Lists and vectors:

type α list = Nil | Cons of α × α list type zero = Zero type _ succ = Succ type (_, α) vec = | VNil : (zero, α) vec | VCons : α × (n, α) vec → (n succ, α) vec let rec to_list : type n. (n, α) vec → α list = function | VNil → Nil | VCons(x, xs) → Cons(x, xs)

  • rnament from to_list : (γ, α) vec → α list

The lifting should be unambiguous.

slide-41
SLIDE 41

Lifting for GADTs

Automatic for some invariants, we only need to give the expected type of the function:

let rec zip xs ys = match xs, ys with | Nil, Nil → Nil | Cons(x, xs), Cons(y, ys) → Cons((x, y), zip xs ys) | _ → failwith "different length"

slide-42
SLIDE 42

Lifting for GADTs

Automatic for some invariants, we only need to give the expected type of the function:

let rec zip xs ys = match xs, ys with | Nil, Nil → Nil | Cons(x, xs), Cons(y, ys) → Cons((x, y), zip xs ys) | _ → failwith "different length" let lifting vzip : type n. (n, α) vec → (n, β) vec → (n, α × β) vec from zip with {to_list} → {to_list} → {to_list}

slide-43
SLIDE 43

Lifting for GADTs

Automatic for some invariants, we only need to give the expected type of the function:

let rec zip xs ys = match xs, ys with | Nil, Nil → Nil | Cons(x, xs), Cons(y, ys) → Cons((x, y), zip xs ys) | _ → failwith "different length" let lifting vzip : type n. (n, α) vec → (n, β) vec → (n, α × β) vec from zip with {to_list} → {to_list} → {to_list} let rec vzip : type n. (n, α) vec → (n, β) vec → (n, α × β) vec = fun xs ys → match xs, ys with | VNil, VNil → VNil | VCons(x, xs), VCons(y, ys) → VCons((x, y), vzip xs ys) | _ → failwith "different length"

slide-44
SLIDE 44

Conclusion

  • 1. Describing ornaments by projection is a good fit for ML
  • 2. There are ornaments in the wild
  • 3. The automatic lifting is incommplete, but gives good and

predictable results

slide-45
SLIDE 45

Questions ?