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

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

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

Programming Languages

Programming Languages

Programming Languages

So what does studying PL buy me?

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

CSE 130 [Winter 2014] Programming Languages

Programming Languages

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

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

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

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

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

CSE 130 [Spring 2014] Programming Languages

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

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

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

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

A First Look at ML. Chapter Five 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

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

CMSC 330, Fall 2013, Practice Problem 3 Solutions

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

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

Functional Programming. Big Picture. Design of Programming Languages

Chapter 15. Functional Programming Languages

Variables and Bindings

Functional Programming

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

CPS 506 Comparative Programming Languages. Programming Language Paradigm

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

Introduction to OCaml

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

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

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions

Example Scheme Function: equal

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

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

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

Chapter 15. Functional Programming Languages

Case by Case. Chapter 3

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

CMSC 330, Fall 2013, Practice Problems 3

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

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

Which of the following expressions has the type int list?

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

Exercises on ML. Programming Languages. Chanseok Oh

Functional Programming. Pure Functional Programming

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

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

Functional Programming. Pure Functional Programming

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

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

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 11 :: Functional Languages

CS 11 Haskell track: lecture 1

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

SML A F unctional Functional Language Language Lecture 19

A quick introduction to SML

Fall Lecture 3 September 4. Stephen Brookes

CSE 341 Section 5. Winter 2018

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

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

Homework 3 COSE212, Fall 2018

Chapter 3 Linear Structures: Lists

Chapter 15. Functional Programming Languages ISBN

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

4/19/2018. Chapter 11 :: Functional Languages

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

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

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

L3 Programming September 19, OCaml Cheatsheet

LECTURE 16. Functional Programming

Data Types The ML Type System

CSE 505. Lecture #9. October 1, Lambda Calculus. Recursion and Fixed-points. Typed Lambda Calculi. Least Fixed Point

Scope. Chapter Ten Modern Programming Languages 1

PROGRAMMING IN HASKELL. Chapter 2 - First Steps

Transcription:

OCaml 1. Introduction Rapid introduction to what s in OCaml 2. Focus on Features Individually as Needed as Semester Progresses *Notes from Sorin Lerner at UCSD* 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 Interacting with ML ession Value 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 ^ 1

Base type: Booleans true bool Complex expressions using operators : Relations : =, <, <=, >= &&,, not true 1 < 2 true aa = pq ( aa = pq ) && (1<2) ( aa = pq ) && (1<2) true 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) Complex types: Product (tuples) (2+2, 7>8); (4,) (9-3, ab ^ cd,(2+2,7>8)) (6, abcd,(4,)) int * bool Triples, (int * string * (int * bool)) 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 2

List operator Cons :: 1::[]; [1] int list 1::[2]; [1;2;3] int list a ::[ b ; c ]; [ a ; b ; c ] string list 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 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 ]; 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 3

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 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] 4

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 Complex types: Functions! A Problem fun x -> x+1;; fun x -> x+1;; int -> int int -> int # let inc = fun x -> x+1 ; val inc : int -> int = # 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 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 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; 5

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; match statement If arg matches this pattern, use this body let mystery l = match l with [] -> 0 (h::t) -> h 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 ;; # let is5lt = lt 5; val is5lt : int -> bool = ; # is5lt 10; # is5lt 2; 6

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