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

Similar documents
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*

So what does studying PL buy me?

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.

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

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

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

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

CSE 130 [Winter 2014] Programming Languages

CSE 130 [Spring 2014] Programming Languages

Programming Languages

Programming Languages

Hi! My name is Sorin. Programming Languages. Why study PL? (discussion) Why study PL? Course Goals. CSE 130 : Fall 2013

Programming Languages

Hi! My name is Sorin. Programming Languages. Why study PL? (discussion) Why study PL? Course Goals. CSE : Fall 2017

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

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

Programming Languages

Hi! My name is Sorin. Programming Languages. Why study PL? (discussion) Why study PL? Course Goals. CSE 130 : Fall 2014

Programming Languages

Begin at the beginning

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

Recap: ML s Holy Trinity

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

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

Recap: Functions as first-class values

Programming Languages

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

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

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

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

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

CSCI-GA Scripting Languages

Programming Languages

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

A First Look at ML. Chapter Five Modern Programming Languages, 2nd ed. 1

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

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

If we have a call. Now consider fastmap, a version of map that uses futures: Now look at the call. That is, instead of

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

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

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

Variables and Bindings

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

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

CMSC 330, Fall 2013, Practice Problem 3 Solutions

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

Functional Programming

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

Chapter 15. Functional Programming Languages

Which of the following expressions has the type int list?

Functional Programming. Big Picture. Design of Programming Languages

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

CPS 506 Comparative Programming Languages. Programming Language Paradigm

Scope and Introduction to Functional Languages. Review and Finish Scoping. Announcements. Assignment 3 due Thu at 11:55pm. Website has SML resources

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

Introduction to OCaml

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

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

CS 11 Haskell track: lecture 1

CIS24 Project #3. Student Name: Chun Chung Cheung Course Section: SA Date: 4/28/2003 Professor: Kopec. Subject: Functional Programming Language (ML)

Example Scheme Function: equal

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions

Chapter 15. Functional Programming Languages

Case by Case. Chapter 3

Functional Programming. Pure Functional Programming

CMSC 330, Fall 2013, Practice Problems 3

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

CS109A ML Notes for the Week of 1/16/96. Using ML. ML can be used as an interactive language. We. shall use a version running under UNIX, called

Exercises on ML. Programming Languages. Chanseok Oh

Programming Language Concepts, cs2104 Lecture 04 ( )

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

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

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

Chapter 15. Functional Programming Languages ISBN

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

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

Parametric types. map: ( a (a b) a list b list. filter: ( a bool) a list a list. Why? a and b are type variables!

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

CSE 341 Section 5. Winter 2018

Functional Programming. Pure Functional Programming

Summer 2017 Discussion 10: July 25, Introduction. 2 Primitives and Define

Data Types The ML Type System

Semantic Analysis. Compiler Architecture

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

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

Chapter 11 :: Functional Languages

Lecture #23: Conversion and Type Inference

SCHEME 7. 1 Introduction. 2 Primitives COMPUTER SCIENCE 61A. October 29, 2015

Spring 2018 Discussion 7: March 21, Introduction. 2 Primitives

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

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

SML A F unctional Functional Language Language Lecture 19

LECTURE 16. Functional Programming

Transcription:

Any questions Say hello to OCaml? void sort(int arr[], int beg, int end){ if (end > beg + 1){ int piv = arr[beg]; int l = beg + 1; int r = end; while (l!= r-1){ if(arr[l] <= piv) l++; else swap(&arr[l], &arr[r--]); } if(arr[l]<=piv && arr[r]<=piv) l=r+1; else if(arr[l]<=piv && arr[r]>piv) {l++; r--;} else if (arr[l]>piv && arr[r]<=piv) swap(&arr[l++], &arr[r--]); else r=l-1; swap(&arr[r--], &arr[beg]); sort(arr, beg, r); sort(arr, l, end); } } Quicksort in C let rec sort l = match l with [] -> [] (h::t) -> let(l,r)= List.partition ((<=) h) t in (sort l)@h::(sort r) Quicksort in Ocaml Why readability matters Say hello to OCaml sort=:(($:@(<#[),(=#[),$:@(>#[))({~?@#))^: (1:<#) Quicksort in J let rec sort l = match l with [] -> [] (h::t) -> let (l,r)= List.partition ((<=) h) t in (sort l)@h::(sort r) Quicksort in OCaml Plan (next 4 weeks) 1. Fast forward Rapid introduction to what s in OCaml 2. Rewind 3. Slow motion Go over the pieces individually History, Variants Meta Language Designed by Robin Milner @ Edinburgh Language to manipulate Theorems/Proofs Several dialects: Standard ML (of New Jersey) Original syntax O Caml: The PL for the discerning hacker French dialect with support for objects State-of-the-art Extensive library, tool, user support (.NET) 1

ML s holy trinity ession Value Interacting with ML Read-Eval-Print Loop Type Everything is an expression Everything has a value Everything has a type 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? Base type: Integers Base type: Strings 2 2 2+2 4 2 * (9+10) 38 ab ab ^ xy ab abxy 2 * (9+10) -12 26 int string Complex expressions using operators :(why the quotes?) +, -, * div, mod Complex expressions using operators :(why the quotes?) Concatenation ^ Base type: Booleans Type Errors true true (2+3) ( a = b ) 1 < 2 true aa = pq ( aa = pq ) && (1<2) ( aa = pq ) && (1<2) bool Complex expressions using operators : Relations : =, <, <=, >= &&,, not true pq ^ 9 (2 + a ) Untypable expression is rejected No casting or coercing Fancy algorithm to catch errors ML s single most powerful feature 2

Complex types: Product (tuples) Complex types: Product (tuples) (2+2, 7>8); (4,) (9-3, ab ^ cd,(2+2,7>8)) (6, abcd,(4,)) int * bool (int * string * (int * bool)) Triples, Nesting: Everything is an expression, nest tuples in tuples []; [] 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, 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 But List operator Cons :: List operator Append @ 1::[]; [1] int list 1::[2]; [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] string 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 ]; 3

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? 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 * (real * real)) triple = 3 elts Lists: Same type, unbounded number: [3;4;5;6;7] int list Syntax: Tuples = comma Lists = semicolon So far, a fancy calculator Variables and bindings let x = e; Bind the value of expression e what do we need next? to the variable x # let x = 2+2;; val x : int = 4 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] # 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 ( 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 : functions, but remember ession Everything is an expression Everything has a value Everything has a type Type Value A function is 5

Complex types: Functions! A Problem fun x -> x+1;; fun x -> x+1;; # 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 int -> int 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 A Solution: Simultaneous Binding fun (x,y) -> x<y; (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 Another Solution fun x -> fun y -> x<y; 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; And how about fun f -> fun x -> not(f x); ( 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; 6

Put it together: a filter function If arg matches then use this pattern 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 list = # 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,2,10] # 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 list * 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 = # let lt = (<) ;; val it : a -> a -> bool = # lt 2 3;; # lt ba ab ;; Put it together: a quicksort function let rec sort l = match l with [] -> [] (h::t) -> let (l,r) = partition ((<) h) t in (sort l)@(h::(sort r)) ;; # let is5lt = lt 5; val is5lt : int -> bool = ; # is5lt 10; # is5lt 2; 7