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

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

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

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

Programming Languages

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)?

CSE 130 [Winter 2014] Programming Languages

Programming Languages

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)?

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

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

Begin at the beginning

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

Recap: ML s Holy Trinity

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

CSE 130 [Spring 2014] Programming Languages

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

Recap: Functions as first-class values

Programming Languages

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

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

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

Programming Languages

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

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

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

CSCI-GA Scripting Languages

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

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

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

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

Variables and Bindings

Functional Programming

CMSC 330, Fall 2013, Practice Problem 3 Solutions

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

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

Chapter 15. Functional Programming Languages

Functional Programming. Big Picture. Design of Programming Languages

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

CPS 506 Comparative Programming Languages. Programming Language Paradigm

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

Introduction to OCaml

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions

Exercises on ML. Programming Languages. Chanseok Oh

CSE 341 Section 5. Winter 2018

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

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

Which of the following expressions has the type int list?

Chapter 15. Functional Programming Languages

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

Case by Case. Chapter 3

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

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

Example Scheme Function: equal

A quick introduction to SML

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

CMSC 330, Fall 2013, Practice Problems 3

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

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

Fall 2017 Discussion 7: October 25, 2017 Solutions. 1 Introduction. 2 Primitives

Fall Lecture 3 September 4. Stephen Brookes

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

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

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

SML A F unctional Functional Language Language Lecture 19

Chapter 3 Linear Structures: Lists

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

Programming in Standard ML: Continued

Functional Programming. Pure Functional Programming

CS 11 Haskell track: lecture 1

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

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

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

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 3 Linear Structures: Lists

Fall 2018 Discussion 8: October 24, 2018 Solutions. 1 Introduction. 2 Primitives

Functional Programming. Pure Functional Programming

CS 320: Concepts of Programming Languages

Homework 3 COSE212, Fall 2018

SCHEME 8. 1 Introduction. 2 Primitives COMPUTER SCIENCE 61A. March 23, 2017

F28PL1 Programming Languages. Lecture 14: Standard ML 4

Programming Language Concepts, cs2104 Lecture 04 ( )

Metaprogramming assignment 3

Introduction to SML Getting Started

Scheme Tutorial. Introduction. The Structure of Scheme Programs. Syntax

Scope. Chapter Ten Modern Programming Languages 1

CS 360 Programming Languages Interpreters

Transcription:

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)

ML s holy trinity Expression Value Type Everything is an expression Everything has a value Everything has a type

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?

Base type: Integers 2 2 2+2 4 2 * (9+10) 38 2 * (9+10) -12 26 int Complex expressions using operators :(why the quotes?) +, -, * div, mod

Base type: Strings ab ab ^ xy ab abxy string Complex expressions using operators :(why the quotes?) Concatenation ^

Base type: Booleans true false true false 1 < 2 true aa = pq ( aa = pq ) && (1<2) ( aa = pq ) && (1<2) false false true bool Complex expressions using operators : Relations : =, <, <=, >= &&,, not

Type Errors (2+3) ( a = b ) pq ^ 9 (2 + a ) Untypable expression is rejected No casting or coercing Fancy algorithm to catch errors ML s single most powerful feature

Complex types: Product (tuples) (2+2, 7>8); (4,false) int * bool

Complex types: Product (tuples) (9-3, ab ^ cd,(2+2,7>8)) (6, abcd,(4,false)) (int * string * (int * bool)) Triples, Nesting: Everything is an expression, nest tuples in tuples

Complex types: Lists []; [] a list Unbounded size Can have lists of anything But [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

Complex types: Lists [1; pq ]; All elements must have same type

Complex types: Lists List operator Cons :: 1::[]; [1] int list 1::[2]; [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 ];

Complex types: Lists List operator Append @ [1;2]@[3;4;5]; [1;2;3;4;5] int list [ a ]@[ b ]; [ a ; b ] string list []@[1]; [1] string list Can only append two lists 1 @ [2;3]; of the same type [1] @ [ a ; b ];

Complex types: Lists List operator head hd hd [1;2]; 1 int hd ([ a ]@[ b ]); a string Only take the head a nonempty list hd [];

Complex types: Lists List operator tail tl tl [1;2;3]; [2;3] int list tl ([ a ]@[ b ]); [ b ] string list 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: Lists: pair = 2 elts triple = 3 elts Same type, unbounded number: Syntax: (3, abcd ) (int * string) (3, abcd,(3.5,4.2)) (int * string * (real * real)) [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] #

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 int tempvar is bound only inside expr body from in ;; Not visible ( in scope ) outside

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 Expression Value Type Everything is an expression Everything has a value Everything has a type A function is

Complex types: Functions! Parameter (formal) Body Expr fun x -> x+1;; fn int -> int # let inc = fun x -> x+1 ; val inc : int -> int = fn # inc 0; val it : int = 1 # inc 10; val it : int = 11 How a call ( application ) is evaluated: 1. Evaluate argument 2. Bind formal to arg value 3. Evaluate Body expr

A Problem Parameter (formal) Body Expr fun x -> x+1;; fn 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 Body expr

A Solution: Simultaneous Binding Parameter (formal) Body Expr fun (x,y) -> x<y; fn (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 Body expr

Another Solution Parameter (formal) Body Expr fun x -> fun y -> x<y; fn int -> (int -> bool) Whoa! A function can return a function # let lt = fun x -> fn y -> x < y ; val lt : int -> int -> bool = fn # let is5lt = lt 5; val is5lt : int -> bool = fn; # is5lt 10; val it : bool = true; # is5lt 2; val it : bool = false;

And how about Parameter (formal) Body Expr fun f -> fun x -> not(f x); fn ( 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 = fn # let is5gte = neg is5lt; val is5gte : int -> bool = fn # is5gte 10; val it : bool = false; # is5gte 2; val it : bool = true; (* 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 = fn # let is5gte = neg is5lt; val is5gte : int -> bool = fn; # is5gte 10; val it : bool = false; # is5gte 2; val it : bool = true;

Put it together: a filter function If arg matches this pattern then use this Body Expr - 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 = fn # 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 = fn # 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 = fn # lt 2 3;; val it : bool = true; # lt ba ab ;; val it : bool = false; # let is5lt = lt 5; val is5lt : int -> bool = fn; # is5lt 10; val it : bool = true; # is5lt 2; val it : bool = false;

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)) ;;