Programming Languages

Similar documents
Programming Languages. Datatypes

Programming Languages. Next: Building datatypes. Suppose I wanted. Next: Building datatypes 10/4/2017. Review so far. Datatypes.

Programming Languages

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

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. Lecture 3: Datatypes. Ranjit Jhala UC San Diego

Recap: ML s Holy Trinity

News. Programming Languages. Recap. Recap: Environments. Functions. of functions: Closures. CSE 130 : Fall Lecture 5: Functions and Datatypes

Recap from last time. Programming Languages. CSE 130 : Fall Lecture 3: Data Types. Put it together: a filter function

Programming Languages

Programming Languages

CSE 130 [Winter 2014] Programming Languages

Recap. Recap. If-then-else expressions. If-then-else expressions. If-then-else expressions. If-then-else expressions

sum: tree -> int sum_leaf: tree -> int sum_leaf: tree -> int Representing Trees Next: Lets get cosy with Recursion Sum up the leaf values. E.g.

Programming Languages

Programming Languages

News. Programming Languages. Complex types: Lists. Recap: ML s Holy Trinity. CSE 130: Spring 2012

Programming Languages

Programming Languages

Programming Languages

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

CSE341: Programming Languages Lecture 2 Functions, Pairs, Lists. Zach Tatlock Winter 2018

Function definitions. CSE341: Programming Languages Lecture 2 Functions, Pairs, Lists. Example, extended. Some gotchas. Zach Tatlock Winter 2018

Programming Languages

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

CS Lecture 5: Pattern Matching. Prof. Clarkson Fall Today s music: Puff, the Magic Dragon by Peter, Paul & Mary

Informatics 1 Functional Programming Lecture 9. Algebraic Data Types. Don Sannella University of Edinburgh

Programming Languages Lecture 14: Sum, Product, Recursive Types

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

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

Begin at the beginning

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

CSE341: Programming Languages Lecture 2 Functions, Pairs, Lists. Dan Grossman Fall 2011

Logic - CM0845 Introduction to Haskell

Today s Plan. Programming Languages. Example : Factorial. Recursion. CSE 130 : Spring Lecture 6: Higher-Order Functions

Programming Languages Lecture 15: Recursive Types & Subtyping

Programming Languages. Programming with λ-calculus. Lecture 11: Type Systems. Special Hour to discuss HW? if-then-else int

Side note: Tail Recursion. Begin at the beginning. Side note: Tail Recursion. Base Types. Base Type: int. Base Type: int

Homework 3 COSE212, Fall 2018

Tail Recursion: Factorial. Begin at the beginning. How does it execute? Tail recursion. Tail recursive factorial. Tail recursive factorial

CMSC 330: Organization of Programming Languages

Inductive Data Types

CSE 341, Autumn 2005, Assignment 3 ML - MiniML Interpreter

GADTs. Wouter Swierstra and Alejandro Serrano. Advanced functional programming - Lecture 7. [Faculty of Science Information and Computing Sciences]

GADTs. Wouter Swierstra. Advanced functional programming - Lecture 7. Faculty of Science Information and Computing Sciences

Lists. Prof. Clarkson Fall Today s music: "Blank Space" by Taylor Swift

GADTs. Alejandro Serrano. AFP Summer School. [Faculty of Science Information and Computing Sciences]

Plan (next 4 weeks) 1. Fast forward. 2. Rewind. 3. Slow motion. Rapid introduction to what s in OCaml. Go over the pieces individually

OCaml. History, Variants. ML s holy trinity. Interacting with ML. Base type: Integers. Base type: Strings. *Notes from Sorin Lerner at UCSD*

Type Checking and Type Inference

News. CSE 130: Programming Languages. Environments & Closures. Functions are first-class values. Recap: Functions as first-class values

Typed Racket: Racket with Static Types

Introduction to Functional Programming in Haskell 1 / 56

CSE 341: Programming Languages

SCHEME The Scheme Interpreter. 2 Primitives COMPUTER SCIENCE 61A. October 29th, 2012

Ornaments in ML. Thomas Williams, Didier Rémy. April 18, Inria - Gallium

Programming Languages. Tail Recursion. CSE 130: Winter Lecture 8: NOT TR. last thing function does is a recursive call

These notes are intended exclusively for the personal usage of the students of CS352 at Cal Poly Pomona. Any other usage is prohibited without

Programming Languages. Example 5. Example 4. CSE 130 : Fall type, can reuse code for all types! let rec cat l = match l with

Background. CMSC 330: Organization of Programming Languages. Useful Information on OCaml language. Dialects of ML. ML (Meta Language) Standard ML

CMSC 330: Organization of Programming Languages. OCaml Data Types

CSE341: Programming Languages Lecture 6 Nested Patterns Exceptions Tail Recursion. Zach Tatlock Winter 2018

Functions & First Class Function Values

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

CSCE 314 Programming Languages

Any questions. Say hello to OCaml. Say hello to OCaml. Why readability matters. History, Variants. Plan (next 4 weeks)

A Programming Language. A different language g is a different vision of life. CSE 130 : Fall Two variables. L1: x++; y--; (y=0)?

Which of the following expressions has the type int list?

Intro. Scheme Basics. scm> 5 5. scm>

CS558 Programming Languages

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

IA014: Advanced Functional Programming

So what does studying PL buy me?

CSE 130 : Fall Programming Languages. Lecture 11: Ranjit Jhala UC San Diego. programming

Fall 2018 Lecture N

GADTs gone mild. Code at Gabriel RADANNE 23 Mars 2017

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

CS 11 Haskell track: lecture 1

The Typed Racket Guide

CSE 307: Principles of Programming Languages

Programming with Math and Logic

Lists. Michael P. Fourman. February 2, 2010

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

Thinking Induc,vely. COS 326 David Walker Princeton University

Metaprogramming assignment 3

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

Administrative Stuff

Handout 2 August 25, 2008

CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions. Dan Grossman Spring 2013

Programming Languages

Programming in Standard ML: Continued

Recursion. Q: What does this evaluate to? Q: What does this evaluate to? CSE 130 : Programming Languages. Higher-Order Functions

Random Testing in 321

Generic polymorphism on steroids

CSE 307: Principles of Programming Languages

SCHEME AND CALCULATOR 5b

Informatics 1 Functional Programming Lecture 4. Lists and Recursion. Don Sannella University of Edinburgh

CS558 Programming Languages

CMSC 430 Introduction to Compilers. Fall Everything (else) you always wanted to know about OCaml (but were afraid to ask)

Software Verification : Introduction

Transcription:

What about more complex data? CSE 130 : Fall 2012 Programming Languages Expressions Values Lecture 3: Datatypes Ranjit Jhala UC San Diego Types Many kinds of expressions: 1. Simple 2. Variables 3. Functions 1 2 What about more complex data? We ve seen some base types and values: Integers, Floats, Bool, String etc. Some ways to build up types: Products (tuples), records, lists Functions What about more complex data? We ve seen some base types and values: Integers, Floats, Bool, String etc. Some ways to build up types: Products (tuples), records, lists Functions Design Principle: Orthogonality Don t clutter core language with stuff Few, powerful orthogonal building techniques Put derived types, values, functions in libraries 3 4

Next: Building datatypes Three key ways to build complex types/values 1. Each-of types Value of T contains value of T1 and a value of T2 2. One-of types Value of T contains value of T1 or a value of T2 Next: Building datatypes Three key ways to build complex types/values 1. Each-of types (T1 * T2) Value of T contains value of T1 and a value of T2 2. One-of types Value of T contains value of T1 or a value of T2 3. Recursive Value of T contains (sub)-value of same type T 3. Recursive Value of T contains (sub)-value of same type T 5 6 Suppose I wanted a program that processed lists of attributes Name (string) Age (integer) DOB (int-int-int) Address (string) Height (float) Alive (boolean) Phone (int-int) email (string) Many kinds of attributes (too many to put in a record) can have multiple names, addresses, phones, emails etc. Want to store them in a list. Can I? Constructing Datatypes type t = C1 of t1 C2 of t2 Cn of tn t is a new datatype. A value of type t is either: a value of type t1 placed in a box labeled C1 Or a value of type t2 placed in a box labeled C2 Or Or a value of type tn placed in a box labeled Cn 7 8

Constructing Datatypes Suppose I wanted type t = C1 of t1 C2 of t2 Cn of tn t Label=C1 Label=C2 Label=Cn Value:t1 OR Value:t2 All have the type t OR Value:tn Attributes: Name (string) Age (integer) DOB (int-int-int) Address (string) Height (real) Alive (boolean) Phone (int-int) email (string) type attrib = Name of string Age of int DOB of int*int*int Address of string Height of float Alive of bool Phone of int*int Email of string;; 9 10 How to PUT values into box? How to PUT values into box? How to create values of type attrib? # let a1 = Name Ranjit ;; val x : attrib = Name Ranjit # let a2 = Height 5.83;; val a2 : attrib = Height 5.83 # let year = 1977 ;; val year : int = 1977 # let a3 = DOB (9,8,year) ;; val a3 : attrib = DOB (9,8,1977) # let a_l = [a1;a2;a3];; val a3 : attrib list = type attrib = Name of string Age of int DOB of int*int*int Address of string Height of float Alive of bool Phone of int*int Email of string;; 11 12

Constructing Datatypes type attrib = Name of string Age of int DOB of int*int*int Address of string Height of float Alive of bool Phone of int*int Email of string;; Name Ranjit OR Age 34 OR DOB (9,8,77) Name Ranjit Age 34 DOB (9,8,77) All have type attrib One-of types We ve defined a one-of type named attrib Elements are one of: string, int, int*int*int, float, bool Can create uniform attrib lists Say I want a function to print attribs datatype attrib = Name of string Age of int DOB of int*int*int Address of string Height of real Alive of bool Phone of int*int Email of string; 13 14 How to TEST & TAKE whats in box? How to TEST & TAKE whats in box? Is it a... string? or an int? or an int*int*int? or... Tag Look at TAG! 15 16

How to tell whats in the box? match e with Name s -> printf "%s" s Age i -> printf "%d" i DOB(d,m,y) -> printf "%d/%d/%d" d m y Address s -> printf "%s" s Height h -> printf "%f" h Alive b -> printf "%b" b s Phone(a,r) -> printf "(%d)-%d" a r Pattern-match expression: check if e is of the form On match: value in box bound to pattern variable matching result expression is evaluated Simultaneously test and extract contents of box 17 How to tell whats in the box? type attrib = Name of string Age of int DOB of int*int*int Address of string Height of float Alive of bool Phone of int*int match e with Name s ->...(*s: string *) Age i ->...(*i: int *) DOB(d,m,y)->...(*d: int,m: int,y: int*) Address a ->...(*a: string*) Height h ->...(*h: int *) Alive b ->...(*b: bool*) Phone(y,r)->...(*a: int, r: int*) Pattern-match expression: check if e is of the form On match: value in box bound to pattern variable matching result expression is evaluated Simultaneously test and extract contents of box 18 How to tell whats in the box How to TEST & TAKE whats in box? # match (Name Ranjit ) with Name s - > printf "Hello %s\n" s Age i - > printf "%d years old" i ;; Hello Ranjit - : unit = () None of the cases matched the tag (Name) Causes nasty Run-Time Error Tag BEWARE!! Be sure to handle all TAGS! 19 20

Beware! Handle All TAGS! Compiler to the Rescue! # match (Name Ranjit ) with Age i - > Printf.printf "%d" i Email s - > Printf.printf "%s" s ;; Exception: Match Failure!! # match (Name Ranjit ) with Age i - > Printf.printf "%d" i Email s - > Printf.printf "%s" s ;; Exception: Match Failure!! None of the cases matched the tag (Name) Causes nasty Run-Time Error None of the cases matched the tag (Name) Causes nasty Run-Time Error 21 22 Compiler To The Rescue!! # let printattrib a = match a with Name s - > Printf.printf "%s" s Age i - > Printf.printf "%d" i DOB (d,m,y) - > Printf.printf "%d / %d / %d" d m y Address addr - > Printf.printf "%s" addr Height h - > Printf.printf "%f" h Alive b - > Printf.printf "%b" b Email e - > Printf.printf "%s" e ;; Warning P: this pattern- matching is not exhaustive. Here is an example of a value that is not matched: Phone (_, _) Compile-time checks for: missed cases: ML warns if you miss a case! Compiler To The Rescue!! # let printattrib a = match a with Name s - > Printf.printf "%s" s Age i - > Printf.printf "%d" i DOB (d,m,y) - > Printf.printf "%d / %d / %d" d m y... Age i - > Printf.printf "%d" i ;; Warning U: this match case is unused. Compile-time checks for: redundant cases: ML warns if a case never matches 23 24

Benefits of match-with match e with C1 x1 -> e1 C2 x2 -> e2 Cn xn -> en type t = C1 of t1 C2 of t2 Cn of tn 1. Simultaneous test-extract-bind 2. Compile-time checks for: missed cases: ML warns if you miss a t value redundant cases: ML warns if a case never matches match-with is an Expression match e with C1 x1 -> e1 C2 x2 -> e2 Cn xn -> en Type Rule e1, e2,,en must have same type T Type of whole expression is T 25 26 T{ T match-with is an Expression match e with Name s -> e1 Age i -> e2 DOB (m,d,y) -> e3 Address a -> e4 Height h -> e5 Alive b -> e6 Phone (a,n) -> e7 Email e -> e8 Type Rule e1, e2,,en must have same type T Type of whole expression is T Next: Building datatypes Three key ways to build complex types/values 1. Each-of types t1 * t2 Value of T contains value of T1 and a value of T2 2. One-of types type t = C1 of t1 C2 of t2 Value of T contains value of T1 or a value of T2 3. Recursive type Value of T contains (sub)-value of same type T 27 28

Recursive types Recursive types Zero Zero Wait a minute! Zero of what?! 29 30 Recursive types Recursive types Zero Zero What are values of nat? Wait a minute! Zero of what?! Relax. Means empty box with label Zero 31 32

Recursive types Recursive types Zero Zero What are values of nat? What are values of nat? One nat contains another! Succ Zero Zero 33 34 Recursive types Recursive types Zero Zero What are values of nat? One nat contains another! Succ What are values of nat? One nat contains another! Succ Succ Succ Succ Zero Zero 35 36

Recursive types Zero What are values of nat? One nat contains another! nat = recursive type Succ Succ Succ Zero... Next: Building datatypes Three key ways to build complex types/values 1. Each-of types t1 * t2 Value of T contains value of T1 and a value of T2 2. One-of types type t = C1 of t1 C2 of t2 Value of T contains value of T1 or a value of T2 3. Recursive type type t =... C of (...*t) Value of T contains (sub)-value of same type T 37 38 Next: Lets get cosy with Recursion Recursive Code Mirrors Recursive Data Next: Lets get cosy with Recursion Code Structure = Type Structure!!! 39 40

to_int : nat -> int to_int : nat -> int let rec to_int n = let rec to_int n = 41 42 to_int : nat -> int to_int : nat -> int let rec to_int n = match n with -> Succ m -> let rec to_int n = match n with -> 0 Base Expression Succ m -> 1 + to_int m Inductive Expression 43 44

of_int : int -> nat of_int : int -> nat let rec of_int n = let rec of_int n = 45 46 of_int : int -> nat of_int : int -> nat let rec of_int n = if n <= 0 then else let rec of_int n = if n <= 0 then Zero Base Expression else Inductive Expression Succ (of_int (n-1)) 47 48

plus : nat*nat -> nat plus : nat*nat -> nat let rec plus (n,m) = let rec plus (n,m) = 49 50 plus : nat*nat -> nat plus : nat*nat -> nat let rec plus (n,m) = match m with -> Succ m -> let rec plus (n,m) = match m with Base Expression -> n Succ m -> Succ (plus (n,m )) Inductive Expression 51 52

times: nat*nat -> nat times: nat*nat -> nat let rec times (n,m) = let rec times (n,m) = 53 54 times: nat*nat -> nat plus : nat*nat -> nat let rec times (n,m) = match m with -> Succ m -> let rec times (n,m) = match m with Base Expression -> Zero Succ m -> plus n (times (n,m )) Inductive Expression 55 56

Lists are recursive types! Next: Lets get cosy with Recursion Recursive Code Mirrors Recursive Data type int_list = Nil Cons of int * int_list Think about this! What are values of int_list? Cons(1,Cons(2,Cons(3,Nil))) Cons(2,Cons(3,Nil)) Cons(3,Nil) Nil Cons 1, Cons 2, Cons 3, Nil 57 58 Lists aren t built-in! Some functions on Lists : Length datatype int_list = Nil Cons of int * int_list Ind pattern let rec len l = match l with Nil -> 0 Cons(h,t) -> 1 + (len t) Base Expression Inductive Expression Lists are a derived type: built using elegant core! 1. Each-of 2. One-of 3. Recursive :: is just a pretty way to say Cons [] is just a pretty way to say Nil let rec len l = match l with Nil -> 0 Cons(_,t) -> 1 + (len t) Matches everything, no binding let rec len l = match l with Cons(_,t) -> 1 + (len t) _ -> 0 Pattern-matching in order - Must match with Nil 59 60

Some functions on Lists : Append Some functions on Lists : Max let rec append (l1,l2) = let rec max xs = Base Expression Base Expression Ind pattern Inductive Expression Ind pattern Inductive Expression Find the right induction strategy Base case: pattern + expression Induction case: pattern + expression Well designed datatype gives strategy Find the right induction strategy Base case: pattern + expression Induction case: pattern + expression Well designed datatype gives strategy 61 62 null, hd, tl are all functions Bad ML style: More than aesthetics! Pattern-matching better than test-extract: ML checks all cases covered ML checks no redundant cases at compile-time: fewer errors (crashes) during execution get the bugs out ASAP! Next: Lets get cosy with Recursion Recursive Code Mirrors Recursive Data 63 64

Representing Trees Representing Trees 1 2 3 Leaf 1 1 2 3 Leaf 2 type tree = Leaf of int Node of tree*tree Node(Node(Leaf 1, Leaf 2), Leaf 3) type tree = Leaf of int Node of tree*tree Node(Node(Leaf 1, Leaf 2), Leaf 3) 65 66 Representing Trees Representing Trees Node 1 2 3 Leaf 1 Leaf 2 1 2 3 Leaf 3 type tree = Leaf of int Node of tree*tree Node(Node(Leaf 1, Leaf 2), Leaf 3) type tree = Leaf of int Node of tree*tree Node(Node(Leaf 1, Leaf 2), Leaf 3) 67 68

Representing Trees Representing Trees Node Node Node Node 1 2 3 Leaf 1 Leaf 2 Leaf 3 1 2 3 Leaf 1 Leaf 2 Leaf 3 type tree = Leaf of int Node of tree*tree Node(Node(Leaf 1, Leaf 2), Leaf 3) type tree = Leaf of int Node of tree*tree Node(Node(Leaf 1, Leaf 2), Leaf 3) 69 70 sum_leaf: tree -> int Next: Lets get cosy with Recursion Recursive Code Mirrors Recursive Data Sum up the leaf values. E.g. # let t0 = Node(Node(Leaf 1, Leaf 2), Leaf 3);; - : int = 6 71 72

sum_leaf: tree -> int sum_leaf: tree -> int type tree = Leaf of int Node of tree*tree type tree = Leaf of int Node of tree*tree let rec sum_leaf t = let rec sum_leaf t = 73 74 sum_leaf: tree -> int sum_leaf: tree -> int nductive pattern type tree = Leaf of int Node of tree*tree type tree = Leaf of int Node of tree*tree nductive pattern let rec sum_leaf t = match t with Leaf n -> Node(t1,t2)-> let rec sum_leaf t = match t with Leaf n -> n Base Expression Node(t1,t2)-> sum_leaf t1 + sum_leaf t2 Inductive Expression 75 76

Another Example: Calculator Recursive Code Mirrors Recursive Data Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 3.78 5.92 (4.0 + 2.9) * (3.78-5.92) Code almost writes itself! 77 78 Another Example: Calculator Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 ====> 6.9 3.78 5.92 ====> -2.14 (4.0 + 2.9) * (3.78-5.92) ====> -14.766 Whats a ML TYPE for REPRESENTING expressions? Another Example: Calculator Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 ====> 6.9 3.78 5.92 ====> -2.14 (4.0 + 2.9) * (3.78-5.92) ====> -14.766 Whats a ML TYPE for REPRESENTING expressions? type expr = Num of float Add of expr*expr Sub of expr*expr Mul of expr*expr 79 80

Another Example: Calculator Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 ====> 6.9 3.78 5.92 ====> -2.14 (4.0 + 2.9) * (3.78-5.92) ====> -14.766 Whats a ML FUNCTION for EVALUATING expressions? Another Example: Calculator Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 ====> 6.9 3.78 5.92 ====> -2.14 (4.0 + 2.9) * (3.78-5.92) ====> -14.766 Whats a ML FUNCTION for EVALUATING expressions? type expr = Num of float Add of expr*expr Sub of expr*expr Mul of expr*expr type expr = Num of float Add of expr*expr Sub of expr*expr Mul of expr*expr 81 82 Another Example: Calculator Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 ====> 6.9 3.78 5.92 ====> -2.14 (4.0 + 2.9) * (3.78-5.92) ====> -14.766 Whats a ML FUNCTION for EVALUATING expressions? Another Example: Calculator Want an arithmetic calculator to evaluate expressions like: 4.0 + 2.9 ====> 6.9 3.78 5.92 ====> -2.14 (4.0 + 2.9) * (3.78-5.92) ====> -14.766 Whats a ML FUNCTION for EVALUATING expressions? type expr = Num of float Add of expr*expr Sub of expr*expr Mul of expr*expr let rec eval e = match e with Num f -> Add(e1,e2)-> Sub(e1,e2)-> Mul(e1,e2)-> type expr = Num of float Add of expr*expr Sub of expr*expr Mul of expr*expr let rec eval e = match e with Num f -> f Add(e1,e2)-> eval e1 +. eval e2 Sub(e1,e2)-> eval e1 -. eval e2 Mul(e1,e2)-> eval e1 *. eval e2 83 84

Random Art from Expressions PA #2 Build more funky expressions, evaluate them, to produce: 85