CMSC 330: Organization of Programming Languages

Slides:



Advertisements
Similar presentations
Introduction A function is called higher-order if it takes a function as an argument or returns a function as a result. twice :: (a  a)  a  a twice.
Advertisements

More ML Compiling Techniques David Walker. Today More data structures lists More functions More modules.
Higher-order functions in ML
Programovací jazyky F# a OCaml Chapter 4. Generic and recursive types.
A Third Look At ML 1. Outline More pattern matching Function values and anonymous functions Higher-order functions and currying Predefined higher-order.
Introduction to OCaml Slides prepared by Matt Gruskin Some material borrowed from the CIS 500 lecture notes.
Higher-order functions in OCaml. Higher-order functions A first-order function is one whose parameters and result are all "data" A second-order function.
F28PL1 Programming Languages Lecture 14: Standard ML 4.
CMSC 330: Organization of Programming Languages Tuples, Types, Conditionals and Recursion or “How many different OCaml topics can we cover in a single.
ML Lists.1 Standard ML Lists. ML Lists.2 Lists  A list is a finite sequence of elements. [3,5,9] ["a", "list" ] []  ML lists are immutable.  Elements.
ML: a quasi-functional language with strong typing Conventional syntax: - val x = 5; (*user input *) val x = 5: int (*system response*) - fun len lis =
Map and Fold Building Powerful Abstractions. Hello. I’m Zach, one of Sorin’s students.
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Fall 2011.
0 PROGRAMMING IN HASKELL Chapter 7 - Higher-Order Functions.
Introduction to ML Last time: Basics: integers, Booleans, tuples,... simple functions introduction to data types This time, we continue writing an evaluator.
7/2/20151 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
Programovací jazyky F# a OCaml Chapter 5. Hiding recursion using function-as-values.
CSE-321 Programming Languages Introduction to Functional Programming (Part II) POSTECH March 13, 2006 박성우.
Patterns in OCaml functions. Formal vs. actual parameters Here's a function definition (in C): –int add (int x, int y) { return x + y; } –x and y are.
Functional Programming With examples in F#. Pure Functional Programming Functional programming involves evaluating expressions rather than executing commands.
1-Nov-15 Haskell II Functions and patterns. Data Types Int + - * / ^ even odd Float + - * / ^ sin cos pi truncate Char ord chr isSpace isUpper … Bool.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell: Higher-order Functions Dr. Hyunyoung Lee.
CMSC 330: Organization of Programming Languages Functional Programming with OCaml.
CMSC 330: Organization of Programming Languages Maps and Folds Anonymous Functions.
CSE 130 : Spring 2011 Programming Languages Ranjit Jhala UC San Diego Lecture 6: Higher-Order Functions.
CMSC 330: Organization of Programming Languages Operational Semantics.
3/8/20161 Programming Languages and Compilers (CS 421) Reza Zamani Based in part on slides by Mattox Beckman, as updated.
Haskell Chapter 5, Part II. Topics  Review/More Higher Order Functions  Lambda functions  Folds.
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
CSE 341 : Programming Languages Lecture 9 Lexical Scope, Closures Zach Tatlock Spring 2014.
1.SML Docs Standard Basis 2.First-Class Functions Anonymous Style Points Higher-Order 3.Examples Agenda.
10/1/20161 Programming Languages and Compilers (CS 421) Elsa L Gunter 2112 SC, UIUC Based in part on slides by Mattox.
Programming Languages and Compilers (CS 421)
Types CSCE 314 Spring 2016.
Programming Languages and Compilers (CS 421)
ML: a quasi-functional language with strong typing
Functions and patterns
Programming Languages and Compilers (CS 421)
Haskell Chapter 4.
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Programming Languages and Compilers (CS 421)
PROGRAMMING IN HASKELL
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Winter 2013.
PROGRAMMING IN HASKELL
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Spring 2013.
Higher Order Functions
Objective caml Daniel Jackson MIT Lab for Computer Science 6898: Advanced Topics in Software Design March 18, 2002.
Nicholas Shahan Spring 2016
Programming Languages and Compilers (CS 421)
Agenda SML Docs First-Class Functions Examples Standard Basis
Agenda SML Docs First-Class Functions Examples Standard Basis
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Spring 2016.
CSE 341 Section 5 Winter 2018.
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Autumn 2018.
CSE341: Programming Languages Section 3 Function Patterns Tail Recursion Winter 2018.
Higher Order Functions
CSE 341 Section 3 Nick Mooney Spring 2017.
Madhusudan Parthasarathy
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Zach Tatlock Winter 2018.
CSE-321 Programming Languages Introduction to Functional Programming
Madhusudan Parthasarathy
Announcements Quiz 5 HW6 due October 23
Functions and patterns
PROGRAMMING IN HASKELL
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Autumn 2017.
PROGRAMMING IN HASKELL
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Spring 2019.
Brett Wortzman Summer 2019 Slides originally created by Dan Grossman
Review Previously in: Lots of language features: functions, lists, records, tuples, variants, pattern matching Today: No new language features New idioms.
Presentation transcript:

CMSC 330: Organization of Programming Languages Functional Programming with OCaml

OCaml Equality # let a1 = [1;2;3];; val a1 : int list = [1; 2; 3] # a1 == a2;; - : bool = false (shallow equality)‏ # a1 = a2;; : bool = true (deep equality)‏ <> is negation of = != is negation of == CMSC 330

Recursion Exercises sum l (* sum of elts in l *) negate l (* negate elements in list *)‏ last l (* last element of l *)‏ CMSC 330

Recursion Exercises sum l (* sum of elts in l *) let rec sum l = match l with [] -> 0 | (x::xs) -> x + (sum xs)‏ negate l (* negate elements in list *)‏ let rec negate l = match l with [] -> [] | (x::xs) -> (-x) :: (negate xs)‏ last l (* last element of l *)‏ let rec last l = match l with [x] -> x | (x::xs) -> last xs CMSC 330

Recursion Exercises (cont'd)‏ (* return a list containing all the elements in the list l followed by all the elements in list m *)‏ append (l, m)‏ rev l (* reverse list; hint: use append *)‏ rev takes O(n2) time. Can you do better? CMSC 330

Recursion Exercises (cont'd)‏ (* return a list containing all the elements in the list l followed by all the elements in list m *)‏ append (l, m)‏ let rec append (l, m) = match l with [] -> m | (x::xs) -> x::(append (xs, m))‏ rev l (* reverse list; hint: use append *)‏ let rec rev l = match l with [] -> [] | (x::xs) -> append ((rev xs), [x])‏ rev takes O(n2) time. Can you do better? CMSC 330

A Clever Version of Reverse let rec rev_helper (l, a) = match l with [] -> a | (x::xs) -> rev_helper (xs, (x::a))‏ let rev l = rev_helper (l, [])‏ Let’s give it a try rev [1; 2; 3] → rev_helper ([1;2;3], []) → rev_helper ([2;3], [1]) → rev_helper ([3], [2;1]) → rev_helper ([], [3;2;1]) → [3;2;1] CMSC 330

More Examples flattenPairs l (* ('a * 'a) list -> 'a list *)‏ take (n, l) (* return first n elts of l *)‏ CMSC 330

More Examples flattenPairs l (* ('a * 'a) list -> 'a list *)‏ let rec flattenPairs l = match l with [] -> [] | ((a, b)::t) -> a :: b :: (flattenPairs t)‏ take (n, l) (* return first n elts of l *)‏ let rec take (n, l) = if n = 0 then [] else match l with | (x::xs) -> x :: (take (n-1, xs))‏ CMSC 330

Working with Lists Several of these examples have the same flavor Walk through the list and do something to every element Walk through the list and keep track of something Recall the following example code from Ruby: Here we passed a code block into the collect method Wouldn’t it be nice to do the same in OCaml? a = [1,2,3,4,5] b = a.collect { |x| -x } CMSC 330

Higher-Order Functions In OCaml you can pass functions as arguments, and return functions as results let plus_three x = x + 3 let twice (f, z) = f (f z)‏ twice (plus_three, 5)‏ (* returns 11 *)‏ twice : ('a->'a) * 'a -> 'a let plus_four x = x + 4 let pick_fn n = if n > 0 then plus_three else plus_four (pick_fn 5) 0 (* returns 3 *)‏ pick_fn : int -> (int->int)‏ CMSC 330

The map Function Let’s write the map function (just like Ruby's collect)‏ Takes a function and a list, applies the function to each element of the list, and returns a list of the results let add_one x = x + 1 let negate x = -x map (add_one, [1; 2; 3])‏ map (negate, [9; -5; 0])‏ Type of map? let rec map (f, l) = match l with [] -> [] | (h::t) -> (f h)::(map (f, t))‏ map : ('a -> 'b) * 'a list -> 'b list CMSC 330

Anonymous Functions Passing functions around is very common So often we don’t want to bother to give them names Use fun to make a function with no name map ((fun x -> x + 13), [1; 2; 3])‏ twice ((fun x -> x + 2), 4)‏ Parameter Body fun x -> x + 3 CMSC 330

Pattern Matching with fun match can be used within fun map ((fun l -> match l with (h::_) -> h), [ [1; 2; 3]; [4; 5; 6; 7]; [8; 9] ])‏ (* [1; 4; 8] *)‏ For complicated matches, though, use named functions Standard pattern matching abbreviation can be used map ((fun (x, y) -> x + y), [(1, 2); (3, 4)])‏ (* [3; 7] *)‏ CMSC 330

All Functions Are Anonymous Functions are first-class, so you can bind them to other names as you like let f x = x + 3 let g = f g 5 (* returns 8 *)‏ let for functions is just a shorthand let f x = body stands for let f = fun x -> body CMSC 330

Examples Short for let next = fun x -> x + 1 let next x = x + 1 Short for let next = fun x -> x + 1 let plus (x, y) = x + y Short for let plus = fun (x, y) -> x + y Which is short for let plus = fun z -> (match z with (x, y) -> x + y)‏ let rec fact n = if n = 0 then 1 else n * fact (n-1)‏ Short for let rec fact = fun n -> (if n = 0 then 1 else n * fact (n-1))‏ CMSC 330

The fold Function Common pattern: iterate through a list and apply a function to each element, keeping track of the partial results computed so far a = “accumulator” this is usually called “fold left” to remind us that f takes the accumulator as its first argument What's the type of fold? let rec fold (f, a, l) = match l with [] -> a | (h::t) -> fold (f, f (a, h), t)‏ fold : ('a * 'b -> 'a) * 'a * 'b list -> 'a CMSC 330

Example We just built the sum function! let add (a, x) = a + x fold (add, 0, [1; 2; 3; 4]) → fold (add, 1, [2; 3; 4]) → fold (add, 3, [3; 4]) → fold (add, 6, [4]) → fold (add, 10, []) → 10 We just built the sum function! let rec fold (f, a, l) = match l with [] -> a | (h::t) -> fold (f, f (a, h), t)‏ CMSC 330

Another Example We just built the length function! let next (a, _) = a + 1 fold (next, 0, [2; 3; 4; 5]) → fold (next, 1, [3; 4; 5]) → fold (next, 2, [4; 5]) → fold (next, 3, [5]) → fold (next, 4, []) → 4 We just built the length function! let rec fold (f, a, l) = match l with [] -> a | (h::t) -> fold (f, f (a, h), t)‏ CMSC 330

Using fold to Build rev Can you build the reverse function with fold? let prepend (a, x) = x::a fold (prepend, [], [1; 2; 3; 4]) → fold (prepend, [1], [2; 3; 4]) → fold (prepend, [2; 1], [3; 4]) → fold (prepend, [3; 2; 1], [4]) → fold (prepend, [4; 3; 2; 1], []) → [4; 3; 2; 1] let rec fold (f, a, l) = match l with [] -> a | (h::t) -> fold (f, f (a, h), t)‏ CMSC 330