Programming Languages

Similar documents
Programming Languages

Programming Languages

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

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)

So what does studying PL buy me?

Programming Languages

Programming Languages

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

CSE 130 [Winter 2014] Programming Languages

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

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

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

Recap: ML s Holy Trinity

Programming Languages

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

Begin at the beginning

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

Programming Languages

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

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

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

Programming Languages

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

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

Recap: Functions as first-class values

Programming Languages

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

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

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

CSE 130 [Spring 2014] Programming Languages

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

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

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

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

Programming Languages

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

CMSC 330, Fall 2013, Practice Problem 3 Solutions

Which of the following expressions has the type int list?

Programming Languages Lecture 14: Sum, Product, Recursive Types

Variables and Bindings

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

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

Introduction to OCaml

Programming Languages

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

Exercises on ML. Programming Languages. Chanseok Oh

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

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

Functional Programming

Lecture #23: Conversion and Type Inference

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

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

Programming in Standard ML: Continued

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

Chapter 15. Functional Programming Languages

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

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

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

Fall Lecture 3 September 4. Stephen Brookes

CPS 506 Comparative Programming Languages. Programming Language Paradigm

Lists. Adrian Groza. Department of Computer Science Technical University of Cluj-Napoca

Programming Languages

CSc 372 Comparative Programming Languages

PROGRAMMING IN HASKELL. Chapter 2 - First Steps

CSC324 Functional Programming Typing, Exceptions in ML

CMSC 330, Fall 2013, Practice Problems 3

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

SML A F unctional Functional Language Language Lecture 19

F28PL1 Programming Languages. Lecture 14: Standard ML 4

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

CS 320: Concepts of Programming Languages

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

Functional Programming. Pure Functional Programming

Thinking Induc,vely. COS 326 David Walker Princeton University

CSE 341 Section 5. Winter 2018

Programming Languages and Compilers (CS 421)

CSE 3302 Programming Languages Lecture 8: Functional Programming

An introduction introduction to functional functional programming programming using usin Haskell

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

CSCI-GA Scripting Languages

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

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

CS 320: Concepts of Programming Languages

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

CSE341, Fall 2011, Midterm Examination October 31, 2011

Chapter 3 Linear Structures: Lists

Programming Languages. Datatypes

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

Chapter 3 Linear Structures: Lists

Variables. Substitution

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

Transcription:

CSE 130 : Fall 2008 Programming Languages Lecture 2: A Crash Course in ML Ranjit Jhala UC San Diego News On webpage: Suggested HW #1, sample for Quiz #1 on Thu PA #1 (due next Fri 10/10) No make-up quizzes (its why we take best 6/9) Office Hours: Matthews: We 10 12pm @ 250A Jhala : Th 1-3 pm @ 250 A Today: A crash course in ML contd Recap: ML s holy trinity ession Type Everything is an expression Everything has a value Everything has a type Value Recap: Interacting with ML Read-Eval-Print Loop Repeat: 1. System reads expression e 2. System evaluates e to get value v 3. System prints value v and type t What are these expressions, values and types? - int, bool, products (tuples), lists

Complex types: Lists Complex types: Lists []; [] a list [1;2;3]; [1;2;3] int list [1+1;2+2;3+3;4+4]; [2;4;6;8] int list [ a ; b ; c ^ d ]; [ a ; b ; cd ] string list [(1, a ^ b );(3+4, c )]; )]; [(1, ab );(7 );(7, c )] (int*string) list [[1];[2;3];[4;5;6]]; [[1];[2;3];[4;5;6]]; (int list) list [1; pq ]; All elements must have same type Unbounded size Can have lists of anything (e.g. lists of lists) But Complex types: Lists List operator Cons :: Complex types: Lists List operator Append @ 1::[]; [1] int list 1::[2;3]; [1;2;3] int list a ::[ b ; c ]; [ a ; b ; c ] string list [1;2]@[3;4;5]; [1;2;3;4;5] int list [ a ]@[ b ]; [ a ; b ] string list []@[1]; [1] int list Can only cons element to a list of same type 1::[ b ; cd ]; Can only append two lists 1 @ [2;3]; of the same type [1] @ [ a ; b ];

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 []; Recap: Tuples vs. Lists? 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: Syntax: [3;4;5;6;7] int list Tuples = comma Lists = semicolon So far, a fancy calculator what do we need next?

Variables and bindings let x = e; Bind the value of expression e to the variable x # let x = 2+2;; val x : int = 4 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] 68] # Variables and bindings 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 Local bindings for expressions using temporary variables let tempvar = x + 2 * y in tempvar * tempvar ;; 17424 tempvar is bound only inside expr body from in ;; Not visible ( not in scope ) outside int

Binding by Pattern-Matching Simultaneously bind several variables # let (x,y,z) = (2+3, a ^ b, 1::[2]);; val x : int = 5 val y : string = ab val z : int list = [1;2] 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 l = [1;2;3]; val l = [1;2;3]: list - val h::t = l; Warning: Binding not exhaustive val h = 1 : int val t = [2;3] : int In general l may be empty (match failure!) Another useful early warning Next class: functions, but remember ession Value Complex types: Functions! fun x -> x+1;; Everything is an expression Everything has a value Everything has a type 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 int -> int How a call ( application ) is evaluated: 1. Evaluate argument 2. Bind formal to arg value 3. Evaluate expr

A Problem A Solution: Simultaneous Binding fun x -> x+1;; fun (x,y) -> x<y; int -> int (int * int) -> bool Can functions only have a single parameter? How a call ( application ) is evaluated: 1. Evaluate argument 2. Bind formal to arg value 3. Evaluate expr Can functions only have a single parameter? How a call ( application ) is evaluated: 1. Evaluate argument 2. Bind formal to arg value 3. Evaluate expr Another Solution And how about fun x -> fun y-> x<y; fun f -> fun x -> not(f x); int -> (int -> bool) Whoa! A function can return a function # let lt = fun x -> y -> x < y ; val lt : int -> int -> bool = # let is5lt = lt 5; val is5lt : int -> bool = ; # is5lt 10; # is5lt 2; ( a ->bool) -> ( a -> bool) A function can also take a function argument # 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 *)

A shorthand for function binding # 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; Put it together: a filter function If arg matches this pattern then use this - let rec filter f l = match l with [] -> [] (h::t)-> if f h then h::(filter f t) else (filter f t);; 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] Put it together: a partition function # 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]) A little trick # 2 <= 3;; val it : bool = true # ba <= ab ;; val it : bool = false # 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;

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