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

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

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

Some Advanced ML Features

Typed Lambda Calculus. Chapter 9 Benjamin Pierce Types and Programming Languages

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

CSCI-GA Scripting Languages

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

More Untyped Lambda Calculus & Simply Typed Lambda Calculus

Introduction to OCaml

LECTURE 16. Functional Programming

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

Functional Programming. Big Picture. Design of Programming Languages

Lambda Calculus.

Types, Type Inference and Unification

CSC312 Principles of Programming Languages : Functional Programming Language. Copyright 2006 The McGraw-Hill Companies, Inc.

So what does studying PL buy me?

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

Lambda Calculus. Concepts in Programming Languages Recitation 6:

G Programming Languages Spring 2010 Lecture 6. Robert Grimm, New York University

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

Introduction to Haskell

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

Programming Languages and Compilers (CS 421)

CS 11 Haskell track: lecture 1

Data Types The ML Type System

Overloading, Type Classes, and Algebraic Datatypes

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

Lecture 12: Data Types (and Some Leftover ML)

COP4020 Programming Assignment 1 - Spring 2011

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

Introduction to OCaml

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

Functional Languages. CSE 307 Principles of Programming Languages Stony Brook University

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

It is better to have 100 functions operate one one data structure, than 10 functions on 10 data structures. A. Perlis

CSE 3302 Programming Languages Lecture 8: Functional Programming

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

Programming Language Concepts: Lecture 19

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

Topics Covered Thus Far CMSC 330: Organization of Programming Languages

CMSC 330: Organization of Programming Languages

Types and Type Inference

Software System Design and Implementation

Programming Languages and Compilers (CS 421)

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

CS558 Programming Languages

CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Dan Grossman Spring 2011

Introduction to ML. Based on materials by Vitaly Shmatikov. General-purpose, non-c-like, non-oo language. Related languages: Haskell, Ocaml, F#,

Haskell An Introduction

Static Checking and Type Systems

CS558 Programming Languages

CSC324 Principles of Programming Languages

CPS 506 Comparative Programming Languages. Programming Language Paradigm

Topics Covered Thus Far. CMSC 330: Organization of Programming Languages. Language Features Covered Thus Far. Programming Languages Revisited

CS 314 Principles of Programming Languages

Pierce Ch. 3, 8, 11, 15. Type Systems

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

Programming Languages

Announcements. CSCI 334: Principles of Programming Languages. Lecture 5: Fundamentals III & ML

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

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

Types and Type Inference

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

Simply-Typed Lambda Calculus

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

Programming Languages Fall 2014

Lecture 7: Type Systems and Symbol Tables. CS 540 George Mason University

Chapter 15. Functional Programming Languages

Lecture 9: Typed Lambda Calculus

Programming Languages

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

According to Larry Wall (designer of PERL): a language by geniuses! for geniuses. Lecture 7: Haskell. Haskell 98. Haskell (cont) - Type-safe!

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

Principles of Programming Languages COMP251: Functional Programming in Scheme (and LISP)

Chapter 15. Functional Programming Languages

Lesson 4 Typed Arithmetic Typed Lambda Calculus

Type Checking and Type Inference

CS558 Programming Languages

Lecture 15 CIS 341: COMPILERS

Functional Programming

Example Scheme Function: equal

Programming Languages

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 17: Types and Type-Checking 25 Feb 08

Type Systems, Type Inference, and Polymorphism

Begin at the beginning

COS 320. Compiling Techniques

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

Introduction to Functional Programming in Haskell 1 / 56

PROGRAMMING IN HASKELL. Chapter 2 - First Steps

Review. CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Let bindings (CBV) Adding Stuff. Booleans and Conditionals

Booleans (aka Truth Values) Programming Languages and Compilers (CS 421) Booleans and Short-Circuit Evaluation. Tuples as Values.

Note 3. Types. Yunheung Paek. Associate Professor Software Optimizations and Restructuring Lab. Seoul National University

Recursion. Tjark Weber. Functional Programming 1. Based on notes by Sven-Olof Nyström. Tjark Weber (UU) Recursion 1 / 37

Chapter 3 Linear Structures: Lists

Francesco Nidito. Programmazione Avanzata AA 2007/08

Functional Languages. Hwansoo Han

CS Lecture 6: Map and Fold. Prof. Clarkson Spring Today s music: Selections from the soundtrack to 2001: A Space Odyssey

Programming Language Features. CMSC 330: Organization of Programming Languages. Turing Completeness. Turing Machine.

CMSC 330: Organization of Programming Languages

Homework 3 COSE212, Fall 2018

Transcription:

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

Typed Lambda Calculus Chapter 9 Benjamin Pierce Types and Programming Languages

Call-by-value Operational Semantics t ::= x x. t terms variable abstraction v ::= x. t values abstraction values t t application ( x. t 12 ) v 2 [x v 2 ] t 12 (E-AppAbs) t 1 t 1 (E-APPL1) t 1 t 2 t 1 t 2 t 2 t 2 (E-APPL2) v 1 t 2 v 1 t 2

Consistency of Function Application Prevent runtime errors during evaluation Reject inconsistent terms What does x x mean? Cannot be always enforced if <tricky computation> then true else ( x. x)

Simple Types T ::= Bool T T types type of Booleans type of functions T 1 T 2 T 3 = T 1 ( T 2 T 3 )

Explicit vs. Implicit Types How to define the type of abstractions? Explicit: defined by the programmer t ::= x x: T. t t t Type terms variable abstraction application Implicit: Inferred by analyzing the body The type checking problem: Determine if typed term is well typed The type inference problem: Determine if there exists a type for (an untyped) term which makes it well typed

Simple Typed Lambda Calculus t ::= x x: T. t t t terms variable abstraction application T::= T T types types of functions

Typing Function Declarations x : T 1 t 2 : T 2 ( x : T 1. t 2 ): T 1 T 2 (T-ABS) A typing context maps free variables into types, x : T 1 t 2 : T 2 ( x : T 1. t 2 ): T 1 T 2 (T-ABS)

Typing Free Variables x : T x : T (T-VAR)

Typing Function Applications t 1 : T 11 T 12 t 2 : T 11 (T-APP) t 1 t 2 : T 12

Typing Conditionals t 1 : Bool t 2 : T t 3 : T if t 1 then t 2 else t 3 : T (T-IF) if true then ( x: Bool. x) else ( y: Bool. not y)

SOS for Simple Typed Lambda Calculus t ::= x x: T. t t t terms variable abstraction application t 1 t 2 t 1 t 1 t 1 t 2 t 1 t 2 v::= x: T. t values abstraction values t 2 t 2 v 1 t 2 v 1 t 2 (E-APP2) (E-APP1) T::= T T types ( x: T 11. t 12 ) v 2 [x v 2 ] t 12 (E-APPABS) types of functions

Type Rules t ::= x x: T. t terms variable abstraction t : T x : T x : T (T-VAR), x : T 1 t 2 : T 2 x : T 1. t 2 : T 1 T 2 (T-ABS) T::= T T types types of functions t 1 : T 11 T 12 t 1 t 2 : T 12 t 2 : T 11 (T-APP) ::= context empty context, x : T term variable binding

t ::= x x: T. t t t true false if t then t else t terms variable abstraction application constant true constant false conditional t : T x : T x : T (T-VAR), x : T 1 t 2 : T 2 x : T 1. t 2 : T 2 : T 1 T 2 (T-ABS) t 1 : T 11 T 12 t 2 : T 11 t 1 t 2 : T 12 (T-APP) T::= types Bool Boolean type T T types of functions ::= context empty context, x : T term variable binding true : Bool (T-TRUE) false : Bool (T-FALSE) t 1 : Bool t 2 : T t 3 : T if t 1 then t 2 else t 3 : T (T-IF)

Simple Example ) x:bool. x ) true t : T x : T x : T (T-VAR), x : T 1 t 2 : T 2 x : T 1. t 2 : T 2 : T 1 T 2 (T-ABS) t 1 : T 11 T 12 t 1 t 2 : T 12 t 2 : T 11 (T-APP) true : Bool (T-TRUE) false : Bool (T-FALSE) t 1 : Bool t 2 : T t 3 : T if t 1 then t 2 else t 3 : T (T-IF)

Another Example t : T if true then ) x:bool. x) else ) x:bool. x) x : T x : T (T-VAR), x : T 1 t 2 : T 2 x : T 1. t 2 : T 2 : T 1 T 2 (T-ABS) t 1 : T 11 T 12 t 1 t 2 : T 12 t 2 : T 11 (T-APP) true : Bool (T-TRUE) false : Bool (T-FALSE) t 1 : Bool t 2 : T t 3 : T if t 1 then t 2 else t 3 : T (T-IF)

Another Example t : T if true then ) x:bool. x) else ( x:bool. y:bool. x) x : T x : T (T-VAR), x : T 1 t 2 : T 2 x : T 1. t 2 : T 2 : T 1 T 2 (T-ABS) t 1 : T 11 T 12 t 1 t 2 : T 12 t 2 : T 11 (T-APP) true : Bool (T-TRUE) false : Bool (T-FALSE) t 1 : Bool t 2 : T t 3 : T if t 1 then t 2 else t 3 : T (T-IF)

Type Safety Well typed programs cannot go wrong If t is well typed then either t is a value or there exists an evaluation step t t [Progress] If t is well typed and there exists an evaluation step t t then t is also well typed [Preservation]

Progress Theorem Does not hold on terms with free variables For every closed well typed term t, either t is a value or there exists t such that t t

Preservation Theorem If t : T and is a permutation of then t : T [Permutation] If t : T and x dom( ) then,t t : T with a proof of the same depth [Weakening] If, x: S t : T and s: S then [x s] t : T [Preservation of types under substitution] t : T and t t then t : T

SOS for Simple Typed Lambda Calculus t ::= x x: T. t t t terms variable abstraction application t 1 t 2 t 1 t 1 t 1 t 2 t 1 t 2 v::= x: T. t values abstraction values t 2 t 2 v 1 t 2 v 1 t 2 (E-APP2) (E-APP1) T::= T T types ( x: T 11. t 12 ) v 2 [x v 2 ] t 12 (E-APPABS) types of functions

Erasure and Typability Types are used for preventing errors and generating more efficient code Types are not used at runtime erase(x) = x erase( x: T 1. t 2 ) = x.erase(t 2 ) erase(t 1 t 2 ) = erase(t 1 ) erase(t 2 ) If t t under typed evaluation relation, then erase(t) erase(t ) A term t in the untyped lamba calculus is typable if there exists a typed term t such that erase(t ) = t

Summary Constructive rules for preventing runtime errors in a Turing complete programming language Efficient type checking Unique types Type safety But limits programming

Summary: Lambda Calculus Powerful The ultimate assembly language Useful to illustrate ideas But can be counterintuitive Usually extended with useful syntactic sugars Other calculi exist pi-calculus object calculus mobile ambients

The ML Programming Language General purpose programming language designed by Robin Milner in 1970 Meta Language for verification Impure Functional Programming Language Eager call by value evaluation Static strongly typed (like Java unlike C) Protect its abstraction via type checking and runtime checking Polymorphic Type Inference Dialects: OCaml, Standard ML, F# Can be viewed as typed calculus with type inference

C is not Type Safe int j; union { int i, int * p } x; x.i = 17 ; j = *(x.p); int i, *p; i =17 p = (int *) i;

Factorial in ML let rec fac n = if n = 0 then 1 else n * fac (n - 1) // val fac : int -> int = <fun> int fac(int n) { if (n = 0) return 1 ; else return n * fac (n - 1) ; }

Factorial in ML let rec fac n = if n = 0 then 1 else n * fac (n - 1) let rec fac n : int = if n = 0 then 1 else n * fac (n - 1) let rec fac = function 0 -> 1 n -> n * fac(n - 1) // val fac : int -> int = <fun> let fac n = let rec ifac n acc = if n=0 then acc else ifac n-1, n * acc in ifac n, 1

Why Study ML? Functional programming will make you think differently about programming Mainstream languages are all about state Functional programming is all about values ML is cutting edge Polymorphic Type inference References Module system Practical (small) Programming Language Useful for Java/Scala New ideas can help make you a better programmer, in any language

Plan Basic Programming in ML ML Modules & References Type Inference for ML

Simple Types Booleans true -: bool = true false -: bool = false if then else types must match Integers 0, 1, 2, -: int =0, 1, +, *, -: int * int -> int Strings I am a string -: string = I am a string Floats 1.0, 2., 3.14159, :- float = 1, 2, 3.14159

Scope Rules ML enforces static nesting on identifiers To be explained later let x = e1 in e2 ( x.e2) e1 let x: T = e1 in e2 ( x:t.e2) e1

Tuples 4, 5, abc :- (int*int*string)=(4, 5, abc ) let max1 (r1, r2) : float = if r1 < r2 then r2 else r1 val max1: float * float -> float = fun let args = (3.5, 4.5) val args: float * float = (3.5, 4.5) max1 args :- float = 4.5 let y(x 1 : t 1, x 2 : t2,, x n : t n )= e

Pattern-Matching Tuples let x 1 : t 1, x 2 : t 2,, x n :t n = e let max1 (pair : float * float) : float = let (r1, r2) = pair in if r1 < r2 then r2 else r1 val max1: float * float -> float = fun let minmax (a, b) : float * float = if a < b then (a, b) else (b, a) val minmax: float * float -> float *float= fun let (mn, mx) = minmax (2.0, 1.0) val mn float 1 val mx float 2 The compiler guarantees the absence of runtime errors

User-Defined Types type day = Sun Mon Tue Wed Thu Fri Sat let int_to_day (i : int) : day = match i mod 7 with 0 -> Sun 1 -> Mon 2 -> Tue 3 -> Wed 4 -> Thu 5 -> Fri _ -> Sat

User-Defined Types C enum day { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; day int_to_day (int i) { switch i % 7 { case 0: return Sun ; case 1: return Mon ; case 2: return Tue ; case 3: return Wed ; case 4: return Thu ; case 5: return Fri ; default: return Sat ; } }

Records type person = {first:string; last:string; age:int} {first= John ; last= Amstrong ; age=77} :- person ={first= John; last= Amstrong ; age=77} {first= John ; last= Amstrong ; age=77}.age :- int = 77 let ja = {first= John ; last= Amstrong ; age=77} val ja : person = {first= John ; last= Amstrong ; age=77} let {first=first; last=last} = ja val first:string= John val last:string = Amstrong

C structs struct person {char * first; char * last; int age} ; struct person ja ={ John, Amstrong,77} ; printf( %d, ja.age); fn = ja.first; ln = ja.last ; ag = ja.age ja.age = 78;

Variant Records Provides a way to declare Algebraic data types type expression = Number of int Plus of expression * expression let rec eval_exp (e : expression) : int = match e with Number(n) -> n Plus (left, right) -> eval_exp(left) + eval_exp(right) val eval_exp : expression -> int = <fun> eval_exp (Plus(Plus(Number(2), Number(3)), Number(5))) :- int = 10

Variant Records in C struct exp { enum {Number, Binop} etype ; /* Select between cases */ union { struct number { int : num; } struct plus { struct exp *left, *right; } } } int eval_exp (struct exp e) { switch e.etype { case Number: return e.number.num ; case Binop : return eval_exp(e.plus.left) + eval_exp(e.plus.right); } }

Wrong Variant Records in C struct exp { enum {Number, Binop} etype ; /* Select between cases */ union { struct number { int : num; } struct plus { struct exp *left, *right; } } } int eval_exp (struct exp e) { switch expression.etype { case Binop: return e.number.num ; case Number : return eval_exp(e.plus.left) + eval_exp(e.plus.right); } }

Scope Local nested scopes Let constructs introduce a scope let f x = e1 in e2 let x = 2 and y = 3 in x + y let rec even x = x = 0 odd (x-1) and odd x = not (x = 0 not (even (x-1))) in odd 3110

Polymorphism A Polymorphic expression may have many types There is a most general type The compiler infers types automatically Programmers can restrict the types Pros: Code reuse Guarantee consistency Cons: Compile-time Some limits on programming let max1 (r1, r2) = if r1 < r2 then r2 else r1 val max1: a * a -> a = fun max1 (5, 7) : - int = 7 max1 (5, 7.5)

Polymorphic Lists [ ] - : 'a list = [] [2; 7; 8 ] - : int list = [2; 7; 8] 2 :: (7 :: (8 ::[ ])) - : int list = [2; 7; 8] [(2, 7) ; (4, 9) ; 5] Error: This expression has type int but an expression was expected of type int * int

Functions on Lists let rec length l = match l with [] -> 0 hd :: tl -> 1 + length tl val length : 'a list -> int = <fun> length [1; 2; 3] + length [ red ; yellow ; green ] :- int = 6 length [ red ; yellow ; 3]

Higher Order Functions Functions are first class objects Passed as parameters Returned as results Practical examples Google map/reduce

Map Function on Lists Apply function to every element of list let rec map f arg = function [] -> [] hd :: tl -> f hd :: (map f tl) val map : ('a -> 'b) -> 'a list -> 'b list = <fun> map (fun x -> x+1) [1;2;3] [2,3,4] Compare to Lisp (define map (lambda (f xs) (if (eq? xs ()) () (cons (f (car xs)) (map f (cdr xs))) )))

More Functions on Lists Append lists let rec append l1 l2 = match l1 with [] -> l2 hd :: tl -> hd :: append (tl l2) val append 'a list -> 'a list -> 'a list let rec append l1 l2 = match l1 with [] -> [] hd :: tl -> hd :: append (tl l2) val append 'a list -> b -> 'a list

More Functions on Lists Reverse a list let rec reverse l = match l with [] -> [] hd :: tl -> append (reverse tl) [hd] val reverse 'a list -> 'a list Questions How efficient is reverse? Can it be done with only one pass through list?

More Efficient Reverse let rev list = let rec aux acc = function [] -> acc h::t -> aux (h::acc) t in aux [] list val rev : 'a list -> 'a list = <fun> 1 3 2 2 2 2 3 3 1 3 1 1

Currying let plus (x, y) = x + y val plus : int * int -> int = fun let plus (z : int * int) = match z with (x, y) -> x + y val plus : int * int -> int = fun let plus = fun (z : int * int) -> match z with (x, y) -> x + y val plus : int * int -> int = fun let plus x y = x + y val plus : int -> int -> int let p1 = plus 5 val p1 : int -> int = fun let p2 = p1 7 val p2 : int = 12

Functional Programming Languages PL types evaluation Side-effect scheme Weakly typed Eager yes ML OCAML F# Haskell Polymorphic strongly typed Polymorphic strongly typed Eager Lazy References None

Things to Notice Pure functions are easy to test prop_revrev l = reverse(reverse l) == l In an imperative or OO language, you have to set up the state of the object and the external state it reads or writes make the call inspect the state of the object and the external state perhaps copy part of the object or global state, so that you can use it in the post condition

Things to Notice Types are everywhere. reverse:: [w] -> [w] Usual static-typing panegyric omitted... In ML, types express high-level design, in the same way that UML diagrams do, with the advantage that the type signatures are machine-checked Types are (almost always) optional: type inference fills them in if you leave them out

Recommended ML Textbooks L. C. PAULSON: ML for the Working Programmer J. Ullman: Elements of ML Programming R. Harper: Programming in Standard ML

Recommended Ocaml Textbooks Xavier Leroy: The OCaml system release 4.02 Part I: Introduction Jason Hickey: Introduction to Objective Caml Yaron Minsky, Anil Madhavapeddy, Jason Hickey: Real World Ocaml

Summary Functional programs provide concise coding Compiled code compares with C code Successfully used in some commercial applications F#, ERLANG, Jane Street Ideas used in imperative programs Good conceptual tool Less popular than imperative programs