Cs776(Prasad)L7fold1 Fold Operations Abstracting Repetitions.

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

Higher-order functions in ML
Programming with Lists
ML Lists.1 Standard ML Lists. ML Lists.2 Lists A list is a finite sequence of elements. [3,5,9] ["a", "list" ] [] Elements may appear more than once [3,4]
ML Lists.1 Standard ML Lists. ML Lists.2 Lists  A list is a finite sequence of elements. [3,5,9] ["a", "list" ] []  Elements may appear more than once.
A Third Look At ML 1. Outline More pattern matching Function values and anonymous functions Higher-order functions and currying Predefined higher-order.
CSE341: Programming Languages Lecture 2 Functions, Pairs, Lists Dan Grossman Winter 2013.
F28PL1 Programming Languages Lecture 14: Standard ML 4.
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.
Chapter 11 Proof by Induction. Induction and Recursion Two sides of the same coin.  Induction usually starts with small things, and then generalizes.
Comp 205: Comparative Programming Languages Higher-Order Functions Functions of functions Higher-order functions on lists Reuse Lecture notes, exercises,
CSE 341 Lecture 16 More Scheme: lists; helpers; let/let*; higher-order functions; lambdas slides created by Marty Stepp
Cs7120 (Prasad)L10-COMB-FN1 Combinatorial Functions Recursion for problem solving.
ML: a quasi-functional language with strong typing Conventional syntax: - val x = 5; (*user input *) val x = 5: int (*system response*) - fun len lis =
© M. Winter COSC 4P41 – Functional Programming Patterns of computation over lists Applying to all – mapping map :: (a -> b) -> [a] -> [b] map f.
Map and Fold Building Powerful Abstractions. Hello. I’m Zach, one of Sorin’s students.
Cse536 Functional Programming 1 6/10/2015 Lecture #6, Oct 13, 2004 Reading Assignments –Read chapter 5 of the Text Polymorphic and Higher-Order Functions.
0 PROGRAMMING IN HASKELL Chapter 7 - Higher-Order Functions.
Higher-Order Functions Koen Lindström Claessen. What is a “Higher Order” Function? A function which takes another function as a parameter. Examples map.
Advanced Programming Handout 4. Introductions  Me: Benjamin C. Pierce (known as Benjamin, or, if you prefer, Dr. Pierce, but not Ben or Professor) 
Introduction to ML - Part 2 Kenny Zhu. What is next? ML has a rich set of structured values Tuples: (17, true, “stuff”) Records: {name = “george”, age.
Chapter 5 Polymorphic and Higher-Order Functions.
CS 2104 : Prog. Lang. Concepts. Functional Programming I Lecturer : Dr. Abhik Roychoudhury School of Computing From Dr. Khoo Siau Cheng’s lecture notes.
CSE-321 Programming Languages Introduction to Functional Programming (Part II) POSTECH March 13, 2006 박성우.
A Third Look At ML Chapter NineModern Programming Languages, 2nd ed.1.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell: Higher-order Functions Dr. Hyunyoung Lee.
CMSC 330: Organization of Programming Languages Maps and Folds Anonymous Functions.
1 CS 457/557: Functional Languages Lists and Algebraic Datatypes Mark P Jones Portland State University.
CSE 130 : Spring 2011 Programming Languages Ranjit Jhala UC San Diego Lecture 6: Higher-Order Functions.
ML Lists.1 Standard ML Lists. ML Lists.2 Lists  A list is a finite sequence of elements. [3,5,9] ["a", "list" ] []  Elements may appear more than once.
0 PROGRAMMING IN HASKELL Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources) Odds and Ends,
Recursion Higher Order Functions CSCE 314 Spring 2016.
Haskell Chapter 5, Part II. Topics  Review/More Higher Order Functions  Lambda functions  Folds.
CSE 341 Lecture 8 curried functions Ullman 5.5 slides created by Marty Stepp
1.SML Docs Standard Basis 2.First-Class Functions Anonymous Style Points Higher-Order 3.Examples Agenda.
Spring 16 CSCI 4430, A Milanova/BG Ryder 1 Announcements HW5 due March 28 Homework Server link is up I will have office hours, Fri or Mon, check Announcements.
© M. Winter COSC 4P41 – Functional Programming Some functions id :: a -> a id x = x const :: a -> b -> a const k _ = k ($) :: (a -> b) -> a -> b.
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)
Recursion.
Programming Languages and Compilers (CS 421)
ML: a quasi-functional language with strong typing
Functional Programming Lecture 12 - more higher order functions
PROGRAMMING IN HASKELL
Higher-Order Functions
PROGRAMMING IN HASKELL
COP4020 Programming Languages
CMSC 330: Organization of Programming Languages
Introduction to Functional Programming in Racket
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Higher Order Functions
Abstracting Repetitions
PROGRAMMING IN HASKELL
Agenda SML Docs First-Class Functions Examples Standard Basis
Agenda SML Docs First-Class Functions Examples Standard Basis
CSE 341 Section 5 Winter 2018.
Higher Order Functions
CS 457/557: Functional Languages Folds
CSE 341 Section 3 Nick Mooney Spring 2017.
Introduction to Functional Programming in Racket
CSE-321 Programming Languages Introduction to Functional Programming
HIGHER ORDER FUNCTIONS
CSE 3302 Programming Languages
Madhusudan Parthasarathy
Announcements Quiz 5 HW6 due October 23
PROGRAMMING IN HASKELL
With thanks to Alexander Lent, Nick Mooney, Spencer Pearson
Review Previously in: Lots of language features: functions, lists, records, tuples, variants, pattern matching Today: No new language features New idioms.
Presentation transcript:

cs776(Prasad)L7fold1 Fold Operations Abstracting Repetitions

cs776(Prasad)L7fold2 Motivation : Appending lists lappend (link) –generalization of binary append to appending an arbitrary number of lists fun lappend [] = [] | lappend (s::ss) = (lappend ss) lappend : ’ a list list -> ’ a list

cs776(Prasad)L7fold3 Properties (Identities) (map f) o lappend = lappend o (map (map f)) filter p ys) = (filter p (filter p ys) (filter p) o lappend = lappend o (map (filter p))

cs776(Prasad)L7fold4 Fold Operators Generalize binary operators to n-ary functions (list functions). Abstract specific patterns of recursion / looping constructs. Potential for optimization of special forms. foldl, accumulate, revfold, … foldr, reduce, fold, … foldl1 foldr1

cs776(Prasad)L7fold5 Foldr (SML97) foldr f a [x1,x2,…,xn] = f( x1, f(x2, …, f(xn,a)...)) fun foldr f a [] = a | foldr f a (x::xs) = f (x, foldr f a xs) foldr : ( ’ a* ’ b -> ’ b) -> ’ b -> ’ a list -> ’b foldr (op +) 10 [1,2,3] = 16

cs776(Prasad)L7fold6 Examples foldr (op +) a [x1,x2,x3] = ( x1 + ( x2 + ( x3 + a) ) ) ) foldr (op ::) [1,0] [4,3,2] = [4,3,2,1,0]

cs776(Prasad)L7fold7 (cont’d) fold in OldML ( not suited for partial eval.) fold : ( ’ a* ’ b -> ’ b) -> ’ a list -> ’ b -> ’ b foldr in Bird and Wadler (Curried func.) reduce in Reade foldr : ( ’ a -> ’ b -> ’ b) -> ’ b -> ’ a list -> ’ b

cs776(Prasad)L7fold8 Foldl (SML97) foldl f a [x1,x2,…,xn] = f(xn,f(…,f(x2,f(x1,a))…)) fun foldl f a [] = a | foldl f a (x::xs) = foldl f (f(x,a)) xs foldl : ( ’ a* ’ b -> ’ b) -> ’ b -> ’ a list -> ’ b foldl (op * ) 10 [1,2,3] = 60

cs776(Prasad)L7fold9 Examples foldl (op *) a [x1,x2,…,xn] = (xn * (…*(x2 * (x1 * a))...)) foldl [0] [[1],[2],[3],[4]] = [4,3,2,1,0] foldl (op ::) [1,0] [4,3,2] = [2,3,4,1,0]

cs776(Prasad)L7fold10 (cont’d) revfold in OldML ( not suited for partial eval.) revfold : ( ’ b* ’ a -> ’ b) -> ’ a list -> ’ b -> ’ b foldl in Bird and Wadler (Curried func.) accumulate in Reade foldl : ( ’ b -> ’ a -> ’ b) -> ’ b -> ’ a list -> ’ b

cs776(Prasad)L7fold11 Examples fun pack ds = foldl (fn (d,v)=> d+v*10) 0 ds pack [1,2,3,4] = 1234 fun packNot ds = foldl (fn (d,v)=> d*10+v) 0 ds packNot [1,2,3,4] = 100 fun packNott ds = foldr (fn (d,v)=> d+v*10) 0 ds packNott [1,2,3,4] = 4321

cs776(Prasad)L7fold12 fun myId lis = foldr (fn (x,xs) => x::xs) [] lis myId [1,2,3,4] = [1,2,3,4] fun myRev lis = foldl (fn (x,xs) => x::xs) [] lis myRev [1,2,3,4] = [4,3,2,1]

cs776(Prasad)L7fold13 fun filter p lis = foldr (fn (x,xs) => if p x then x::xs else xs) [] lis; filter (fn x => x = 2) [1,2,3,2] fun filterNeg p lis = foldl (fn (x,xs) => if p x then xs else [] lis; filterNeg (fn x => true) [“a”,”b”,”a”]

cs776(Prasad)L7fold14 fun takewhile p lis = foldr (fn (x,xs) => if p x then x::xs else []) [] lis; takewhile (fn x => x = 2) [2,2,3,1,2] fun dropwhile p lis = foldl (fn (x,xs) => if null xs andalso p x then xs else [] lis; dropwhile (fn x => true) [1,2,3]

cs776(Prasad)L7fold15 Generalizing Operators without identity element E.g., max, min, etc for which basis clause (for []) cannot be defined. foldl_1 fun foldl_1 f (x::xs) = foldl f x xs; foldr_1 fun foldr_1 f (x::[]) = x foldr_1 | foldr_1 f (x::y::ys) = foldr_1 f x (foldr_1 f (y::ys))

cs776(Prasad)L7fold16 Laws : Identities If f is a binary function that is associative and a is an identity w.r.t. f, then foldr f a xs = foldl f a (rev xs) foldr [] [[1,2],[3,4],[5]] = [1,2,3,4,5] foldl [] (rev [[1,2],[3,4],[5]]) = [1,2,3,4,5] foldl [] [[1,2],[3,4],[5]] = [5,3,4,1,2]

cs776(Prasad)L7fold17 Laws : Identities If f is a binary function that is commutative and a is an identity w.r.t. f, then foldr f a xs = foldl f a xs foldr (op * ) 1 [1,2,3] = 6 foldl (op * ) 1 [1,2,3] = 6 foldr (fn(b,v)=> b andalso v) true [false] = false foldl (fn(b,v)=> b andalso v) true [false] = false

cs776(Prasad)L7fold18 foldl (op +) 0 [1,2,3] = foldl (op +) 1 [2,3] = foldl (op +) 3 [3] = foldl (op +) 6 [] = 6 ( foldl : Efficient) (Tail Recursive) foldr (op +) 0 [1,2,3] =1+foldr (op +) 0 [2,3] =3 + foldr (op +) 0 [3] =6 + foldr (op +) 0 [] = 6 foldl and t [t,f,t] = foldl and t [f,t] = foldl and f [t] = foldl and f [] = false ( foldr : Efficient) (Short-circuit evaluation) foldr and t [t,f,t] = and t (foldr and t [f,t] = and f (foldr and t [t]) = false Comparing foldl and foldr.

cs776(Prasad)L7fold19 scan (processing prefixes) scan f a [x1,x2,…,xn] = [a,(f a x1),(f (f a x1) x2),…, (f … (f (f a x1) x2) …xn)] fun scan f a [] = [a] | scan f a xs = let val t = (scan f a (init xs)) in [(f (last t) (last xs))] end;