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

Similar documents
Programming Languages

Programming Languages

Programming Languages

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

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

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

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

Programming Languages

So what does studying PL buy me?

Programming Languages

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

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

CSE 130 [Winter 2014] Programming Languages

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

Begin at the beginning

Recap: ML s Holy Trinity

Programming Languages

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

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. Functional Programming with Lists

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

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

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

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

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

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

Programming Languages

Programming Languages. So why study PL? A Programming Language. A different language is a different vision of life. CSE 130 : Spring 2015

Programming Languages. So why study PL? A Programming Language. A different language is a different vision of life. CSE 130 : Fall 2015

Programming Languages

Recap: Functions as first-class values

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

Tuples. CMSC 330: Organization of Programming Languages. Examples With Tuples. Another Example

CSE 130 [Spring 2014] Programming Languages

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

Programming Languages Lecture 14: Sum, Product, Recursive Types

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

Programming Languages

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.

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

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

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

A Third Look At ML. Chapter Nine Modern Programming Languages, 2nd ed. 1

CMSC 330, Fall 2013, Practice Problem 3 Solutions

Which of the following expressions has the type int list?

Exercises on ML. Programming Languages. Chanseok Oh

Lecture #23: Conversion and Type Inference

Conversion vs. Subtyping. Lecture #23: Conversion and Type Inference. Integer Conversions. Conversions: Implicit vs. Explicit. Object x = "Hello";

Functional Programming

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

Variables and Bindings

Programming Languages

CSCI-GA Scripting Languages

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

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

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

Programming Languages

CSE 3302 Programming Languages Lecture 8: Functional Programming

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

PROGRAMMING IN HASKELL. Chapter 2 - First Steps

Lecture #13: Type Inference and Unification. Typing In the Language ML. Type Inference. Doing Type Inference

Redefinition of an identifier is OK, but this is redefinition not assignment; Thus

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

CMSC 330: Organization of Programming Languages. Lets, Tuples, Records

Introduction to OCaml

Programming in Standard ML: Continued

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

02157 Functional Programming. Michael R. Ha. Lecture 2: Functions, Types and Lists. Michael R. Hansen

CS 11 Haskell track: lecture 1

Homework 5. Notes. Turn-In Instructions. Reading. Problems. Handout 19 CSCI 334: Spring (Required) Read Mitchell, Chapters 6 and 7.

Lecture 19: Functions, Types and Data Structures in Haskell

Note that pcall can be implemented using futures. That is, instead of. we can use

CS 320: Concepts of Programming Languages

CSc 372 Comparative Programming Languages

Programming Languages and Compilers (CS 421)

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

CSc 372. Comparative Programming Languages. 8 : Haskell Function Examples. Department of Computer Science University of Arizona

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

CMSC 330, Fall 2013, Practice Problems 3

CSCE 314 TAMU Fall CSCE 314: Programming Languages Dr. Flemming Andersen. Haskell Functions

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

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

Racket. CSE341: Programming Languages Lecture 14 Introduction to Racket. Getting started. Racket vs. Scheme. Example.

Chapter 3 Linear Structures: Lists

Thinking Induc,vely. COS 326 David Walker Princeton University

CS 320: Concepts of Programming Languages

Introduction to OCaml

Chapter 3 Linear Structures: Lists

Type Checking and Type Inference

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

CSE 341 Section 5. Winter 2018

Chapter 15. Functional Programming Languages

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

Programming Languages and Techniques (CIS120)

Scheme. Functional Programming. Lambda Calculus. CSC 4101: Programming Languages 1. Textbook, Sections , 13.7

CSE 130 [Winter 2014] Programming Languages

CSE341, Fall 2011, Midterm Examination October 31, 2011

Transcription:

News CSE 130: Spring 2012 Programming Languages On webpage: Suggested HW #1 PA #1 (due next Fri 4/13) Lecture 2: A Crash Course in ML Please post questions to Piazza Ranjit Jhala UC San Diego Today: A crash course in ML contd 1 2 Recap: ML s Holy Trinity Complex types: Lists essions (Syntax) Exec-time Dynamic Values (Semantics) []; [] a list [1;2;3]; [1;2;3] int list [1+1;2+2;3+3;4+4]; [2;4;6;8] int list Compile-time Static Types [ a ; b ; c ^ d ]; [ a ; b ; cd ] string list [(1, a ^ b );(3+4, c )]; [(1, ab );(7, c )] (int*string) list 1. Programmer enters expression 2. ML checks if expression is well-typed Using a precise set of rules, ML tries to find a unique type for the expression meaningful type for the expr 3. ML evaluates expression to compute value Of the same type found in step 2 [[1];[2;3];[4;5;6]]; [[1];[2;3];[4;5;6]]; (int list) list Unbounded size Can have lists of anything (e.g. lists of lists) But 3 4

Complex types: Lists Complex types: Lists List operator Cons :: [1; pq ]; All elements must have same type 1::[]; [1] int list 1::[2;3]; [1;2;3] int list a ::[ b ; c ]; [ a ; b ; c ] string list Can only cons element to a list of same type 1::[ b ; cd ]; 5 6 Lists: Construct Complex types: Lists Nil operator List operator Append @ [] []: a list [] => [] [1;2]@[3;4;5]; [1;2;3;4;5] int list [ a ]@[ b ]; [ a ; b ] string list []@[1]; [1] int list Cons operator 1::[2;3] [1;2;3] int list Can only append two lists 1 @ [2;3]; e1:t e2: T list e1=>v1 e2=> v2 of the same type [1] @ [ a ; b ]; e1::e2 : T list e1::e2 => v1::v2 7 8

Complex types: Lists Complex types: Lists List operator head hd List operator tail tl hd [1;2]; 1 int tl [1;2;3]; [2;3] int list hd ([ a ]@[ b ]); a string tl ([ a ]@[ b ]); [ b ] string list Only take the head a nonempty list hd []; Only take the tail of nonempty list tl []; 9 10 Lists: Deconstruct Recap: Tuples vs. Lists? e :T list e => v1::v2 Head hd e : T hd e => v1 Tail e :T list e => v1::v2 tl e : T list tl e => v2 (hd [[];[1;2;3]]) = (hd [[];[ a ]]) int list e string list 1 :T e 2 :T What s the difference? Tuples: Different types, but fixed number: (3, abcd ) (int * string) pair = 2 elts (3, abcd,(3.5,4.2)) (int * string * (float * float)) triple = 3 elts Lists: Same type, unbounded number: [3;4;5;6;7] int list e 1 =e 2 : bool 11 12

So far, a fancy calculator So far, a fancy calculator what do we need next? Branches 13 14 If-then-else expressions If-then-else expressions e1 : bool e2: T e3: T if (1 < 2) then [1;2] else 5 if e1 then e2 else e3 : T if false then [1;2] else 5 Then-subexp, Else-subexp must have same type! Equals type of resulting expression then-subexp, else-subexp must have same type! which is the type of resulting expression if 1>2 then [1,2] else [] [] if 1<2 then [] else [ a ] [] int list string list (if 1>2 then [1,2] else [])=(if 1<2 then [] else [ a ]) e1 : bool e2: T e3: T if e1 then e2 else e3 : T 15 16

So far, a fancy calculator Variables and bindings let x = e; Variables Bind the value of expression e to the variable x # let x = 2+2;; val x : int = 4 17 18 Variables and bindings Variables and bindings Later declared expressions can use x Most recent bound value used for evaluation # let x = 2+2;; val x : int = 4 # let y = x * x * x;; val y : int = 64 # let z = [x;y;x+y];; val z : int list = [4;64;68] # Undeclared variables (i.e. without a value binding) are not accepted! # let p = a + 1; Characters 8-9: let p = a + 1 ;; ^ Unbound value a Catches many bugs due to typos 19 20

Local bindings Binding by Pattern-Matching for expressions using temporary variables let tempvar = x + 2 * y in tempvar * tempvar ;; 17424 int Simultaneously bind several variables # let (x,y,z) = (2+3, a ^ b, 1::[2]);; val x : int = 5 tempvar is bound only inside expr body from in Not visible ( not in scope ) outside val y : string = ab val z : int list = [1;2] 21 22 Binding by Pattern-Matching But what of: # let h::t = [1;2;3];; Warning P: this pattern-matching not exhaustive. val h : int = 1 val t : int list = [2;3] Why is it whining? # let h::t = []; Exception: Match_failure # let XS = [1;2;3]; val xs = [1;2;3]: list - val h::t = xs; Warning: Binding not exhaustive val h = 1 : int val t = [2;3] : int In general xs may be empty (match failure!) Another useful early warning 23 Functions 24

Next class: functions, but remember ession Value Type Complex types: Functions! fun x -> x+1;; int -> int Everything is an expression Everything has a value Everything has a type A function is a value! # let inc = fun x -> x+1 ; val inc : int -> int = # inc 0; val it : int = 1 # inc 10; val it : int = 11 25 26 A Problem A Solution: Simultaneous Binding fun x -> x+1;; fun (x,y) -> x<y; int -> int (int * int) -> bool Functions only have ONE parameter?! How a call ( application ) is evaluated: 1. Evaluate argument 2. Bind formal to arg value 3. Evaluate expr Functions only have ONE parameter? How a call ( application ) is evaluated: 1. Evaluate argument 2. Bind formal to arg value 3. Evaluate expr 27 28

Another Solution ( Currying ) And how about fun x -> fun y-> x<y; fun f -> fun x -> not(f x); int -> (int -> bool) ( a ->bool) -> ( a -> bool) Whoa! A function can return a function A function can also take a function argument # let lt = fun x -> fun y -> x < y ; val lt : int -> int -> bool = # let is5lt = lt 5; val is5lt : int -> bool = ; # is5lt 10; # is5lt 2; 29 # let neg = fun f -> fun x -> not (f x); val lt : int -> int -> bool = # let is5gte = neg is5lt; val is5gte : int -> bool = # is5gte 10; # is5gte 2; (* odd, even *) 30 A shorthand for function binding Put it together: a filter function # let neg = fun f -> fun x -> not (f x); # let neg f x = not (f x); val neg : int -> int -> bool = # let is5gte = neg is5lt; val is5gte : int -> bool = ; # is5gte 10; # is5gte 2; If arg matches this pattern then use this - let rec filter f xs = match xs with [] -> [] (x::xs )-> if f x then x::(filter f xs ) else (filter f xs );; val filter : ( a->bool)-> a list-> a lisi) = # let list1 = [1;31;12;4;7;2;10];; # filter is5lt list1 ;; val it : int list = [31;12;7;10] # filter is5gte list1;; val it : int list = [1;4;2] # filter even list1;; val it : int list = [12;4;2;10] 31 32

Put it together: a partition function A little trick # 2 <= 3;; val it : bool = true # ba <= ab ;; val it : bool = false # let partition f l = (filter f l, filter (neg f) l); val partition :( a->bool)-> a list-> a lisi * a list = # let list1 = [1,31,12,4,7,2,10]; - # partition is5lt list1 ; val it : (int list * int list) = ([31,12,7,10],[1,2,10] # partition even list1; val it : (int list * int list) = ([12,4,2,10],[1,31,7]) # let lt = (<) ;; val it : a -> a -> bool = # lt 2 3;; # lt ba ab ;; # let is5lt = lt 5; val is5lt : int -> bool = ; # is5lt 10; # is5lt 2; 33 34 Put it together: a quicksort function let rec sort xs = match xs with [] -> [] (h::t) -> let (l,r) = partition ((<) h) t in (sort l)@(h::(sort r)) Now, lets begin at the beginning 35