Programming Languages and Compilers (CS 421)

Similar documents
ML 3 Working with ADTs

Programming Languages and Compilers (CS 421)

MP 5 A Parser for PicoML

# true;; - : bool = true. # false;; - : bool = false 9/10/ // = {s (5, "hi", 3.2), c 4, a 1, b 5} 9/10/2017 4

Booleans (aka Truth Values) Programming Languages and Compilers (CS 421) Booleans and Short-Circuit Evaluation. Tuples as Values.

Programming Languages and Compilers (CS 421)

Programming Languages and Compilers (CS 421)

Two Problems. Programming Languages and Compilers (CS 421) Type Inference - Example. Type Inference - Outline. Type Inference - Example

Programming Languages and Compilers (CS 421)

n What is its running time? 9/18/17 2 n poor_rev [1,2,3] = n (poor_rev [1] = n ((poor_rev [1] =

Programming Languages and Compilers (CS 421)

n (0 1)*1 n a*b(a*) n ((01) (10))* n You tell me n Regular expressions (equivalently, regular 10/20/ /20/16 4

Note first midterm date: Wed. evening, Feb. 23 Today's class: Types in OCaml and abstract syntax

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

Programming Languages and Compilers (CS 421)

CS 321 Programming Languages

Forward Recursion. Programming Languages and Compilers (CS 421) Mapping Recursion. Forward Recursion: Examples. Folding Recursion.

CSC324- TUTORIAL 5. Shems Saleh* *Some slides inspired by/based on Afsaneh Fazly s slides

CMSC 330: Organization of Programming Languages. Functional Programming with Lists

Programming Languages and Compilers (CS 421)

Programming Languages & Compilers. Programming Languages and Compilers (CS 421) I. Major Phases of a Compiler. Programming Languages & Compilers

Lecture 19: Functions, Types and Data Structures in Haskell

Programming Languages and Compilers (CS 421)

Introduction to OCaml

Lecture: Functional Programming

Programming Languages and Techniques (CIS120)

Introduction to OCaml

CS421 Spring 2014 Midterm 1

Programming Languages and Techniques (CIS120)

Programming Languages & Compilers. Programming Languages and Compilers (CS 421) Programming Languages & Compilers. Major Phases of a Compiler

Programming Languages and Techniques (CIS120)

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

n Takes abstract syntax trees as input n In simple cases could be just strings n One procedure for each syntactic category

CMSC 330: Organization of Programming Languages. Functional Programming with Lists

CMSC 330: Organization of Programming Languages. OCaml Expressions and Functions

Programming Languages

Recap: ML s Holy Trinity. Story So Far... CSE 130 Programming Languages. Datatypes. A function is a value! Next: functions, but remember.

CSE 130 Programming Languages. Datatypes. Ranjit Jhala UC San Diego

Types and Programming Languages. Lecture 5. Extensions of simple types

Programming Language. Control Structures: Selection (switch) Eng. Anis Nazer First Semester

Why OCaml? Introduction to Objective Caml. Features of OCaml. Applications written in OCaml. Stefan Wehr

Introduction to Objective Caml

Recap: ML s Holy Trinity

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

CMSC 330: Organization of Programming Languages

Mini-ML. CS 502 Lecture 2 8/28/08

CSE 130 Programming Languages. Lecture 3: Datatypes. Ranjit Jhala UC San Diego

OCaml. ML Flow. Complex types: Lists. Complex types: Lists. The PL for the discerning hacker. All elements must have same type.

Programming Languages and Techniques (CIS120)

Datatype declarations

The type checker will complain that the two branches have different types, one is string and the other is int

22c:111 Programming Language Concepts. Fall Types I

Programming Languages and Techniques (CIS120)

CS Lecture 6: Map and Fold. Prof. Clarkson Fall Today s music: Selections from the soundtrack to 2001: A Space Odyssey

CVO103: Programming Languages. Lecture 5 Design and Implementation of PLs (1) Expressions

CS Lectures 2-3. Introduction to OCaml. Polyvios Pratikakis

Forward recursion. CS 321 Programming Languages. Functions calls and the stack. Functions calls and the stack

CSCE 314 Programming Languages

Programming Languages

Programming Languages and Compilers (CS 421)

Programming Languages and Compilers (CS 421)

CS321 Languages and Compiler Design I Winter 2012 Lecture 13

CS 11 Ocaml track: lecture 2

Programming Languages. Datatypes

Boolean Data-Type. Boolean Data Type (false, true) i.e. 3/6/2018. The type bool is also described as being an integer: bool bflag; bflag = true;

Introduction to Functional Programming in OCaml

l e t print_name r = p r i n t _ e n d l i n e ( Name : ^ r. name)

Which of the following expressions has the type int list?

Typed Racket: Racket with Static Types

CS Lecture 6: Map and Fold. Prof. Clarkson Spring Today s music: Selections from the soundtrack to 2001: A Space Odyssey

Programming Languages and Techniques (CIS120)

CIS 120 Midterm I October 2, Name (printed): Username (login id):

CSE 130: Programming Languages. Polymorphism. Ranjit Jhala UC San Diego

CS 440: Programming Languages and Translators, Spring 2019 Mon

CS153: Compilers Lecture 14: Type Checking

Programovací jazyky F# a OCaml. Chapter 5. Hiding recursion using function-as-values

Enumerated Types. CSE 114, Computer Science 1 Stony Brook University

Metaprogramming assignment 3

n <exp>::= 0 1 b<exp> <exp>a n <exp>m<exp> 11/7/ /7/17 4 n Read tokens left to right (L) n Create a rightmost derivation (R)

Programming Languages and Compilers (CS 421)

Inductive Data Types

Chapter 3, Selection. Liang, Introduction to Programming with C++, Second Edition, (c) 2010 Pearson Education, Inc. All rights reserved.

Topic 7: Algebraic Data Types

CS153: Compilers Lecture 15: Local Optimization

Haske k ll An introduction to Functional functional programming using Haskell Purely Lazy Example: QuickSort in Java Example: QuickSort in Haskell

CS3110 Spring 2016 Lecture 6: Modules

Programming Languages

A Second Look At ML. Chapter Seven Modern Programming Languages, 2nd ed. 1

Standard ML. Data types. ML Datatypes.1

Inductive data types (I)

CS349/SE382 A1 C Programming Tutorial

The Typed Racket Guide

CSE 130 [Winter 2014] Programming Languages

An introduction introduction to functional functional programming programming using usin Haskell

02157 Functional Programming. Michael R. Ha. Disjoint Unions and Higher-order list functions. Michael R. Hansen

Begin at the beginning

CSCI312 Principles of Programming Languages!

Programming Languages and Techniques (CIS120)

Dialects of ML. CMSC 330: Organization of Programming Languages. Dialects of ML (cont.) Features of ML. Functional Languages. Features of ML (cont.

Chapter 3 Linear Structures: Lists

Transcription:

Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC http://courses.engr.illinois.edu/cs421 Based in part on slides by Mattox Beckman, as updated by Vikram Adve and Gul Agha 9/25/17 1

Data type in Ocaml: lists n Frequently used lists in recursive program n Matched over two structural cases n [ ] - the empty list n (x :: xs) a non-empty list n Covers all possible lists n type a list = [ ] (::) of a * a list n Not quite legitimate declaration because of special syntax 9/25/17 2

Variants - Syntax (slightly simplified) n type name = C 1 [of ty 1 ]... C n [of ty n ] n Introduce a type called name n (fun x -> C i x) : ty 1 -> name n C i is called a constructor; if the optional type argument is omitted, it is called a constant n Constructors are the basis of almost all pattern matching 9/25/17 3

Enumeration Types as Variants An enumeration type is a collection of distinct values In C and Ocaml they have an order structure; order by order of input 9/25/17 4

Enumeration Types as Variants # type weekday = Monday Tuesday Wednesday Thursday Friday Saturday Sunday;; type weekday = Monday Tuesday Wednesday Thursday Friday Saturday Sunday 9/25/17 5

Functions over Enumerations # let day_after day = match day with Monday -> Tuesday Tuesday -> Wednesday Wednesday -> Thursday Thursday -> Friday Friday -> Saturday Saturday -> Sunday Sunday -> Monday;; val day_after : weekday -> weekday = <fun> 9/25/17 6

Functions over Enumerations # let rec days_later n day = match n with 0 -> day _ -> if n > 0 then day_after (days_later (n - 1) day) else days_later (n + 7) day;; val days_later : int -> weekday -> weekday = <fun> 9/25/17 7

Functions over Enumerations # days_later 2 Tuesday;; - : weekday = Thursday # days_later (-1) Wednesday;; - : weekday = Tuesday # days_later (-4) Monday;; - : weekday = Thursday 9/25/17 8

Problem: # type weekday = Monday Tuesday Wednesday Thursday Friday Saturday Sunday;; n Write function is_weekend : weekday -> bool let is_weekend day = 9/25/17 9

Problem: # type weekday = Monday Tuesday Wednesday Thursday Friday Saturday Sunday;; n Write function is_weekend : weekday -> bool let is_weekend day = match day with Saturday -> true Sunday -> true _ -> false 9/25/17 10

Example Enumeration Types # type bin_op = IntPlusOp IntMinusOp EqOp CommaOp ConsOp # type mon_op = HdOp TlOp FstOp SndOp 9/25/17 11

Disjoint Union Types n Disjoint union of types, with some possibly occurring more than once ty 1 ty 2 ty 1 n We can also add in some new singleton elements 9/25/17 12

Disjoint Union Types # type id = DriversLicense of int SocialSecurity of int Name of string;; type id = DriversLicense of int SocialSecurity of int Name of string # let check_id id = match id with DriversLicense num -> not (List.mem num [13570; 99999]) SocialSecurity num -> num < 900000000 Name str -> not (str = "John Doe");; val check_id : id -> bool = <fun> 9/25/17 13

Problem n Create a type to represent the currencies for US, UK, Europe and Japan 9/25/17 14

Problem n Create a type to represent the currencies for US, UK, Europe and Japan type currency = Dollar of int Pound of int Euro of int Yen of int 9/25/17 15

Example Disjoint Union Type # type const = BoolConst of bool IntConst of int FloatConst of float StringConst of string NilConst UnitConst 9/25/17 16

Example Disjoint Union Type # type const = BoolConst of bool IntConst of int FloatConst of float StringConst of string NilConst UnitConst n How to represent 7 as a const? n Answer: IntConst 7 9/25/17 17

Polymorphism in Variants n The type 'a option is gives us something to represent non-existence or failure # type 'a option = Some of 'a None;; type 'a option = Some of 'a None n Used to encode partial functions n Often can replace the raising of an exception 9/25/17 18

Functions producing option # let rec first p list = match list with [ ] -> None (x::xs) -> if p x then Some x else first p xs;; val first : ('a -> bool) -> 'a list -> 'a option = <fun> # first (fun x -> x > 3) [1;3;4;2;5];; - : int option = Some 4 # first (fun x -> x > 5) [1;3;4;2;5];; - : int option = None 9/25/17 19

Functions over option # let result_ok r = match r with None -> false Some _ -> true;; val result_ok : 'a option -> bool = <fun> # result_ok (first (fun x -> x > 3) [1;3;4;2;5]);; - : bool = true # result_ok (first (fun x -> x > 5) [1;3;4;2;5]);; - : bool = false 9/25/17 20

Problem n Write a hd and tl on lists that doesn t raise an exception and works at all types of lists. 9/25/17 21

Problem n Write a hd and tl on lists that doesn t raise an exception and works at all types of lists. n let hd list = match list with [] -> None (x::xs) -> Some x n let tl list = match list with [] -> None (x::xs) -> Some xs 9/25/17 22

Mapping over Variants # let optionmap f opt = match opt with None -> None Some x -> Some (f x);; val optionmap : ('a -> 'b) -> 'a option -> 'b option = <fun> # optionmap (fun x -> x - 2) (first (fun x -> x > 3) [1;3;4;2;5]);; - : int option = Some 2 9/25/17 23

Folding over Variants # let optionfold somefun noneval opt = match opt with None -> noneval Some x -> somefun x;; val optionfold : ('a -> 'b) -> 'b -> 'a option -> 'b = <fun> # let optionmap f opt = optionfold (fun x -> Some (f x)) None opt;; val optionmap : ('a -> 'b) -> 'a option -> 'b option = <fun> 9/25/17 24

Recursive Types n The type being defined may be a component of itself ty ty ty 9/25/17 25

Recursive Data Types # type int_bin_tree = Leaf of int Node of (int_bin_tree * int_bin_tree);; type int_bin_tree = Leaf of int Node of (int_bin_tree * int_bin_tree) 9/25/17 26

Recursive Data Type Values # let bin_tree = Node(Node(Leaf 3, Leaf 6),Leaf (-7));; val bin_tree : int_bin_tree = Node (Node (Leaf 3, Leaf 6), Leaf (-7)) 9/25/17 27

Recursive Data Type Values bin_tree = Node Node Leaf (-7) Leaf 3 Leaf 6 9/25/17 28

Recursive Data Types # type exp = VarExp of string ConstExp of const MonOpAppExp of mon_op * exp BinOpAppExp of bin_op * exp * exp IfExp of exp* exp * exp AppExp of exp * exp FunExp of string * exp 9/25/17 29

Recursive Data Types # type bin_op = IntPlusOp IntMinusOp EqOp CommaOp ConsOp # type const = BoolConst of bool IntConst of int # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp n How to represent 6 as an exp? 9/25/17 30

Recursive Data Types # type bin_op = IntPlusOp IntMinusOp EqOp CommaOp ConsOp # type const = BoolConst of bool IntConst of int # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp n How to represent 6 as an exp? n Answer: ConstExp (IntConst 6) 9/25/17 31

Recursive Data Types # type bin_op = IntPlusOp IntMinusOp EqOp CommaOp ConsOp # type const = BoolConst of bool IntConst of int # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp n How to represent (6, 3) as an exp? 9/25/17 32

Recursive Data Types # type bin_op = IntPlusOp IntMinusOp EqOp CommaOp ConsOp # type const = BoolConst of bool IntConst of int # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp n How to represent (6, 3) as an exp? n BinOpAppExp (CommaOp, ConstExp (IntConst 6), ConstExp (IntConst 3)) 9/25/17 33

Recursive Data Types # type bin_op = IntPlusOp IntMinusOp EqOp CommaOp ConsOp # type const = BoolConst of bool IntConst of int # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp n How to represent [(6, 3)] as an exp? n BinOpAppExp (ConsOp, BinOpAppExp (CommaOp, ConstExp (IntConst 6), ConstExp (IntConst 3)), ConstExp NilConst))));; 9/25/17 34

Recursive Functions # let rec first_leaf_value tree = match tree with (Leaf n) -> n Node (left_tree, right_tree) -> first_leaf_value left_tree;; val first_leaf_value : int_bin_tree -> int = <fun> # let left = first_leaf_value bin_tree;; val left : int = 3 9/25/17 35

Problem type int_bin_tree =Leaf of int Node of (int_bin_tree * int_bin_tree);; n Write sum_tree : int_bin_tree -> int n Adds all ints in tree let rec sum_tree t = 9/25/17 36

Problem type int_bin_tree =Leaf of int Node of (int_bin_tree * int_bin_tree);; n Write sum_tree : int_bin_tree -> int n Adds all ints in tree let rec sum_tree t = match t with Leaf n -> n Node(t1,t2) -> sum_tree t1 + sum_tree t2 9/25/17 37

Recursion over Recursive Data Types # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp FunExp of string * exp AppExp of exp * exp n How to count the number of variables in an exp? 9/25/17 38

Recursion over Recursive Data Types # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp FunExp of string * exp AppExp of exp * exp n How to count the number of variables in an exp? # let rec varcnt exp = match exp with VarExp x -> ConstExp c -> BinOpAppExp (b, e1, e2) -> FunExp (x,e) -> AppExp (e1, e2) -> 9/25/17 39

Recursion over Recursive Data Types # type exp = VarExp of string ConstExp of const BinOpAppExp of bin_op * exp * exp FunExp of string * exp AppExp of exp * exp n How to count the number of variables in an exp? # let rec varcnt exp = match exp with VarExp x -> 1 ConstExp c -> 0 BinOpAppExp (b, e1, e2) -> varcnt e1 + varcnt e2 FunExp (x,e) -> 1 + varcnt e AppExp (e1, e2) -> varcnt e1 + varcnt e2 9/25/17 40

Your turn now Try Problem 3 on MP3 9/25/17 41

Mapping over Recursive Types # let rec ibtreemap f tree = match tree with (Leaf n) -> Leaf (f n) Node (left_tree, right_tree) -> Node (ibtreemap f left_tree, ibtreemap f right_tree);; val ibtreemap : (int -> int) -> int_bin_tree -> int_bin_tree = <fun> 9/25/17 42

Mapping over Recursive Types # ibtreemap ((+) 2) bin_tree;; - : int_bin_tree = Node (Node (Leaf 5, Leaf 8), Leaf (-5)) 9/25/17 43

Folding over Recursive Types # let rec ibtreefoldright leaffun nodefun tree = match tree with Leaf n -> leaffun n Node (left_tree, right_tree) -> nodefun (ibtreefoldright leaffun nodefun left_tree) (ibtreefoldright leaffun nodefun right_tree);; val ibtreefoldright : (int -> 'a) -> ('a -> 'a -> 'a) -> int_bin_tree -> 'a = <fun> 9/25/17 44

Folding over Recursive Types # let tree_sum = ibtreefoldright (fun x -> x) (+);; val tree_sum : int_bin_tree -> int = <fun> # tree_sum bin_tree;; - : int = 2 9/25/17 45

Mutually Recursive Types # type 'a tree = TreeLeaf of 'a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; type 'a tree = TreeLeaf of 'a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist) 9/25/17 46

Mutually Recursive Types - Values # let tree = TreeNode (More (TreeLeaf 5, (More (TreeNode (More (TreeLeaf 3, Last (TreeLeaf 2))), Last (TreeLeaf 7)))));; 9/25/17 47

Mutually Recursive Types - Values val tree : int tree = TreeNode (More (TreeLeaf 5, More (TreeNode (More (TreeLeaf 3, Last (TreeLeaf 2))), Last (TreeLeaf 7)))) 9/25/17 48

Mutually Recursive Types - Values TreeNode More More Last TreeLeaf TreeNode TreeLeaf 5 More Last 7 TreeLeaf TreeLeaf 3 2 9/25/17 49

Mutually Recursive Types - Values A more conventional picture 5 7 3 2 9/25/17 50

Mutually Recursive Functions # let rec fringe tree = match tree with (TreeLeaf x) -> [x] (TreeNode list) -> list_fringe list and list_fringe tree_list = match tree_list with (Last tree) -> fringe tree (More (tree,list)) -> (fringe tree) @ (list_fringe list);; val fringe : 'a tree -> 'a list = <fun> val list_fringe : 'a treelist -> 'a list = <fun> 9/25/17 51

Mutually Recursive Functions # fringe tree;; - : int list = [5; 3; 2; 7] 9/25/17 52

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size 9/25/17 53

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size let rec tree_size t = match t with TreeLeaf _ -> TreeNode ts -> 9/25/17 54

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size let rec tree_size t = match t with TreeLeaf _ -> 1 TreeNode ts -> treelist_size ts 9/25/17 55

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size and treelist_size let rec tree_size t = match t with TreeLeaf _ -> 1 TreeNode ts -> treelist_size ts and treelist_size ts = 9/25/17 56

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size and treelist_size let rec tree_size t = match t with TreeLeaf _ -> 1 TreeNode ts -> treelist_size ts and treelist_size ts = match ts with Last t -> More t ts -> 9/25/17 57

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size and treelist_size let rec tree_size t = match t with TreeLeaf _ -> 1 TreeNode ts -> treelist_size ts and treelist_size ts = match ts with Last t -> tree_size t More t ts -> tree_size t + treelist_size ts 9/25/17 58

Problem # type 'a tree = TreeLeaf of a TreeNode of 'a treelist and 'a treelist = Last of 'a tree More of ('a tree * 'a treelist);; Define tree_size and treelist_size let rec tree_size t = match t with TreeLeaf _ -> 1 TreeNode ts -> treelist_size ts and treelist_size ts = match ts with Last t -> tree_size t More t ts -> tree_size t + treelist_size ts 9/25/17 59

Nested Recursive Types # type 'a labeled_tree = TreeNode of ('a * 'a labeled_tree list);; type 'a labeled_tree = TreeNode of ('a * 'a labeled_tree list) 9/25/17 60

Nested Recursive Type Values # let ltree = TreeNode(5, [TreeNode (3, []); TreeNode (2, [TreeNode (1, []); TreeNode (7, [])]); TreeNode (5, [])]);; 9/25/17 61

Nested Recursive Type Values val ltree : int labeled_tree = TreeNode (5, [TreeNode (3, []); TreeNode (2, [TreeNode (1, []); TreeNode (7, [])]); TreeNode (5, [])]) 9/25/17 62

Nested Recursive Type Values Ltree = TreeNode(5) :: :: :: [ ] TreeNode(3) TreeNode(2) TreeNode(5) [ ] :: :: [ ] [ ] TreeNode(1) TreeNode(7) [ ] [ ] 9/25/17 63

Nested Recursive Type Values 5 3 2 5 1 7 9/25/17 64

Mutually Recursive Functions # let rec flatten_tree labtree = match labtree with TreeNode (x,treelist) -> x::flatten_tree_list treelist and flatten_tree_list treelist = match treelist with [] -> [] labtree::labtrees -> flatten_tree labtree @ flatten_tree_list labtrees;; 9/25/17 65

Mutually Recursive Functions val flatten_tree : 'a labeled_tree -> 'a list = <fun> val flatten_tree_list : 'a labeled_tree list -> 'a list = <fun> # flatten_tree ltree;; - : int list = [5; 3; 2; 1; 7; 5] n Nested recursive types lead to mutually recursive functions 9/25/17 66

Infinite Recursive Values # let rec ones = 1::ones;; val ones : int list = [1; 1; 1; 1;...] # match ones with x::_ -> x;; Characters 0-25: Warning: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: [] match ones with x::_ -> x;; ^^^^^^^^^^^^^^^^^^^^^^^^^ - : int = 1 9/25/17 67

Infinite Recursive Values # let rec lab_tree = TreeNode(2, tree_list) and tree_list = [lab_tree; lab_tree];; val lab_tree : int labeled_tree = TreeNode (2, [TreeNode(...); TreeNode(...)]) val tree_list : int labeled_tree list = [TreeNode (2, [TreeNode(...); TreeNode(...)]); TreeNode (2, [TreeNode(...); TreeNode(...)])] 9/25/17 68

Infinite Recursive Values # match lab_tree with TreeNode (x, _) -> x;; - : int = 2 9/25/17 69

Records n Records serve the same programming purpose as tuples n Provide better documentation, more readable code n Allow components to be accessed by label instead of position n Labels (aka field names must be unique) n Fields accessed by suffix dot notation 9/25/17 70

Record Types n Record types must be declared before they can be used in OCaml # type person = {name : string; ss : (int * int * int); age : int};; type person = { name : string; ss : int * int * int; age : int; } n person is the type being introduced n name, ss and age are the labels, or fields 9/25/17 71

Record Values n Records built with labels; order does not matter # let teacher = {name = "Elsa L. Gunter"; age = 102; ss = (119,73,6244)};; val teacher : person = {name = "Elsa L. Gunter"; ss = (119, 73, 6244); age = 102} 9/25/17 72

Record Pattern Matching # let {name = elsa; age = age; ss = (_,_,s3)} = teacher;; val elsa : string = "Elsa L. Gunter" val age : int = 102 val s3 : int = 6244 9/25/17 73

Record Field Access # let soc_sec = teacher.ss;; val soc_sec : int * int * int = (119, 73, 6244) 9/25/17 74

Record Values # let student = {ss=(325,40,1276); name="joseph Martins"; age=22};; val student : person = {name = "Joseph Martins"; ss = (325, 40, 1276); age = 22} # student = teacher;; - : bool = false 9/25/17 75

New Records from Old # let birthday person = {person with age = person.age + 1};; val birthday : person -> person = <fun> # birthday teacher;; - : person = {name = "Elsa L. Gunter"; ss = (119, 73, 6244); age = 103} 9/25/17 76

New Records from Old # let new_id name soc_sec person = {person with name = name; ss = soc_sec};; val new_id : string -> int * int * int -> person -> person = <fun> # new_id "Guieseppe Martin" (523,04,6712) student;; - : person = {name = "Guieseppe Martin"; ss = (523, 4, 6712); age = 22} 9/25/17 77