Rewriting your function using map and foldr

Similar documents
ormap, andmap, and filter

Solving Your Problem by Generalization

foldr CS 5010 Program Design Paradigms Lesson 5.4

More About Recursive Data Types

From Templates to Folds

Halting Measures and Termination Arguments

Trees. CS 5010 Program Design Paradigms Lesson 6.2

Case Study: Undefined Variables

Trees. CS 5010 Program Design Paradigms Bootcamp Lesson 5.1

CS 5010 Program Design Paradigms Lesson 6.1

Case Study: Free Variables

Observer Templates. CS 5010 Program Design Paradigms Lesson 1.4

Lists. CS 5010 Program Design Paradigms Bootcamp Lesson 4.1

Lists of Lists. CS 5010 Program Design Paradigms Bootcamp Lesson 5.3

How to Design Programs

Module 8: Local and functional abstraction

CS 314 Principles of Programming Languages

Contracts, Purpose Statements, Examples and Tests

Lists of Lists. CS 5010 Program Design Paradigms Bootcamp Lesson 6.5

The Data Design Recipe

CS 135 Winter 2018 Tutorial 7: Accumulative Recursion and Binary Trees. CS 135 Winter 2018 Tutorial 7: Accumulative Recursion and Binary Trees 1

(add1 3) 4 (check-expect (add1 3) 4)

Model-View-Controller Architecture

Expression Values Operators. (string-append a b c ) a, b, c string-append. (substring abcd 0 2) abcd, 0, 2 substring

Using Inheritance to Share Implementations

Programming Languages. Function-Closure Idioms. Adapted from Dan Grossman's PL class, U. of Washington

Basics of Inheritance

CS115 - Module 9 - filter, map, and friends

Generative and accumulative recursion. What is generative recursion? Example revisited: GCD. Readings: Sections 25, 26, 27, 30, 31

The Design Recipe Fall 2017

CSE 341 Section Handout #6 Cheat Sheet

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

Loops in Scheme, II. (early slides assume map/filter)

Binary Search. CS 5010 Program Design Paradigms Bootcamp Lesson 8.2

CS 1101 Exam 3 A-Term 2013

Working with images and scenes

Doing it in Java. CS 5010 Program Design Paradigms Bootcamp Lesson 5.4

The purpose of this lesson is to familiarize you with the basics of Racket (a dialect of Scheme). You will learn about


The Design Recipe Fall 2018

CS 314 Principles of Programming Languages

Functional abstraction. What is abstraction? Eating apples. Readings: HtDP, sections Language level: Intermediate Student With Lambda

Functional abstraction

Repetition Through Recursion

CS 135 Fall 2018 Final Exam Review. CS 135 Fall 2018 Final Exam Review 1

CS 314 Principles of Programming Languages. Lecture 16

CSU211 Exam 2 Fall 2007

Local definitions and lexical scope

Local definitions and lexical scope. Local definitions. Motivating local definitions. s(s a)(s b)(s c), where s = (a + b + c)/2.

Module 5: Lists. Readings: HtDP, Sections 9, 10.

Types of recursion. Structural vs. general recursion. Pure structural recursion. Readings: none. In this module: learn to use accumulative recursion

Lambda Notes for CS 2102

YOUR NAME PLEASE: *** SOLUTIONS ***

Project 5 - The Meta-Circular Evaluator

(add1 3) 4 (check-expect (add1 3) 4)

Types of recursion. Readings: none. In this module: a glimpse of non-structural recursion. CS 135 Winter : Types of recursion 1

6.001 Notes: Section 8.1

Homework 8: Matrices Due: 11:59 PM, Oct 30, 2018

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

CS1102: Macros and Recursion

Project 5 - The Meta-Circular Evaluator

Outline. Helper Functions and Reuse. Conditionals. Evaluation Rules for cond. Design Recipe with cond. Compound Data

CS 61A Discussion 8: Scheme. March 23, 2017

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

Announcements. The current topic: Scheme. Review: BST functions. Review: Representing trees in Scheme. Reminder: Lab 2 is due on Monday at 10:30 am.

CS115 - Module 10 - General Trees

Local defini1ons. Func1on mul1ples- of

CS 314 Principles of Programming Languages

Module 10: Imperative Programming, Modularization, and The Future

Google Docs Website (Sign in or create an account):

User-defined Functions. Conditional Expressions in Scheme

Procedural abstraction SICP Data abstractions. The universe of procedures forsqrt. Procedural abstraction example: sqrt

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

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

A quick introduction to SML

Working with recursion. From definition to template. Readings: HtDP, sections 11, 12, 13 (Intermezzo 2).

Working with recursion

Processadors de Llenguatge II. Functional Paradigm. Pratt A.7 Robert Harper s SML tutorial (Sec II)

CS 440: Programming Languages and Translators, Spring 2019 Mon

The files IList.java, MTList.java, and ConsList.java that define a generic cons-list that implements the Traversal interface.

Typed Racket: Racket with Static Types

Below are example solutions for each of the questions. These are not the only possible answers, but they are the most common ones.

Introduction to Typed Racket. The plan: Racket Crash Course Typed Racket and PL Racket Differences with the text Some PL Racket Examples

Homework 6: Higher-Order Procedures Due: 11:59 PM, Oct 16, 2018

CS 61A, Fall, 2002, Midterm #2, L. Rowe. 1. (10 points, 1 point each part) Consider the following five box-and-arrow diagrams.

MORE SCHEME. 1 What Would Scheme Print? COMPUTER SCIENCE MENTORS 61A. October 30 to November 3, Solution: Solutions begin on the following page.

Discussion 12 The MCE (solutions)

Australian researchers develop typeface they say can boost memory, that could help students cramming for exams.

Scheme in Scheme: The Metacircular Evaluator Eval and Apply

CS61A Midterm 2 Review (v1.1)

Graphs. Directed graphs. Readings: Section 28

Extensible Pattern Matching

CSCC24 Functional Programming Scheme Part 2

Typed Scheme: Scheme with Static Types

UNIVERSITY OF EDINBURGH COLLEGE OF SCIENCE AND ENGINEERING SCHOOL OF INFORMATICS INFR08013 INFORMATICS 1 - FUNCTIONAL PROGRAMMING

CS 320: Concepts of Programming Languages

Lists. Readings: HtDP, sections 9 and 10. Avoid 10.3 (uses draw.ss). CS 135 Winter : Lists 1

Graphs. Readings: Section 28. CS 135 Fall : Graphs 1

Scheme Basics > (butfirst '(help!)) ()

You must include a signature, purpose, check- expects and complete function definition.

Transcription:

Rewriting your function using map and foldr CS 5010 Program Design Paradigms Bootcamp Lesson 5.5 Mitchell Wand, 2012-2014 This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. 1

Introduction In this lesson, we will learn to recognize when your function is suitable for replacement by one of the built-in HOFs (map, filter, foldr, etc.) 2

Learning Objectives At the end of this lesson you should be able to: Use the built-in HOFs for processing lists found in ISL. Recognize the HOF that's appropriate for your function. Follow a recipe for converting your use of a template into a use of a HOF. Follow a recipe for defining a new function using a HOF. 3

Introduction There are many ways to generalize functions built using the ListOfX template. The textbook refers to these as the list abstractions. We prefer the word generalization, since abstraction can mean many things. Chapter 18 of HtDP/2e gives a helpful list of the built-in list abstractions in ISL. We've seen most of these before, but let's look at them all together. 4

Pre-built HOFs for lists (1) (Chapter 18) ;; map : (X -> Y) ListOfX -> ListOfY ;; construct a list by applying f to each item of the given ;; list. ;; that is, (map f (list x_1... x_n)) ;; = (list (f x_1)... (f x_n)) (define (map f alox)...) ;; foldr : (X Y -> Y) Y ListOfX -> Y ;; apply f on the elements of the given list from right to ;; left, starting with base. ;; (foldr f base (list x_1... x_n)) ;; = (f x_1... (f x_n base)) (define (foldr f base alox)...) The book doesn't use the GIVEN/RETURNS form for purpose statements. But you still need to do so for the functions you write! 5

Pre-built HOFs for lists (2) (Chapter 18) ;; build-list : NonNegInt (NonNegInt -> X) -> ListOfX ;; construct (list (f 0)... (f (- n 1))) (define (build-list n f)...) ;; filter : (X -> Boolean) ListOfX -> ListOfX ;; construct the list from all items on alox for which p ;; holds (define (filter p alox)...) 6

Pre-built HOFs for lists (3) (Chapter 18) ;; andmap : (X -> Boolean) ListOfX -> Boolean ;; determine whether p holds for every item on alox ;; that is, (andmap p (list x_1... x_n)) ;; = (and (p x_1)... (p x_n)) (define (andmap p alox)...) ;; ormap : (X -> Boolean) ListOfX -> Boolean ;; determine whether p holds for at least one item on alox ;; that is, (ormap p (list x_1... x_n)) ;; = (or (p x_1)... (p x_n)) (define (ormap p alox)...) 7

Which of these should I use? We can write a recipe to help you decide which of these functions to use, if any. 8

Recipe for Rewriting Your Function to Use the Pre-Built HOFs for lists Recipe for Rewriting your function to use the Pre-Built HOFs for lists 1. Start with your function definition, written using the template for some list data. 2. Determine whether the function is a candidate for using one of the built-in HOFs 3. Determine which built-in HOF is appropriate 4. Rewrite your function using the built-in abstraction. The new strategy is "Use HOF..." 5. Comment out the old definition. Do not change the contract, purpose statement, examples, or tests. 9

A candidate for map or foldr looks like (define (f lst a b c) (cond [(empty? lst)...] [else (... (first lst) this: (f (rest lst) a b c))])) takes a list and some other arguments Here are the things that make your use of a template a candidate for one of the list abstractions. recurs on the rest of the list; other arguments don't change 10

A candidate for map looks like this: ;; f : ListOfX... -> ListOfY (define (f lst a b c) (cond [(empty? lst) empty] [else (cons (... (first lst) a b c) empty here (f (rest lst) a b c))])) Function takes a list and some other arguments, and returns a list cons here 11

A candidate for andmap looks like this: ;; f : ListOfX... -> Bool (define (f lst a b c) (cond [(empty? lst) true] [else (and and here (... (first lst) a b c) (f (rest lst) a b c))])) Function takes a list and some other arguments, and returns a boolean true here 12

A candidate for ormap looks like this: ;; f : ListOfX... -> Bool (define (f lst a b c) (cond [(empty? lst) false] [else (or or here (... (first lst) a b c) (f (rest lst) a b c))])) Function takes a list and some other arguments, and returns a boolean False here 13

A candidate for foldr looks like this: ;; f : ListOfX... ->?? (define (f lst a b c) (cond [(empty? lst)...] [else (... (first lst) and none of the above patterns (map, andmap, ormap) apply. (f (rest lst) a b c))])) 14

A candidate for filter looks like this: ;; f : ListOfX... -> ListOfX (define (f lst a b c) (cond [(empty? lst) empty] [else (if (... (first lst) a b c) if test is true, includes the first element in the answer recurs on the rest of the list; other arguments don't change (cons (first lst) Function takes a list and some other arguments, and returns a list of the same type. (f (rest lst) a b c)) (f (rest lst) a b c))])) makes a decision based on the first element of the list 15

Patterns for using higher-order functions We've looked at which uses of the list template might be rewritten using higherorder functions. Next we'll look at what the function will look like when it's rewritten. The exact form of the rewritten definition will be different for each of the abstraction functions (map, filter, foldr, etc.). Lets look at each of those. 16

General pattern for using a HOF on lists ;; list-fn : ListOfX ->?? (define (list-fn lst) (local (; contract for combiner (define (combiner...)...)) (abstraction combiner... lst))) Choose your abstraction from the ones in Chapter 18. The contract for your combiner depends on which abstraction you choose. The arguments for the different abstractions are different. If this were foldr, the base would go here. 17

Pattern for using an HOF: map ;; list-fn : ListOfX -> ListOfY (define (list-fn lst) (local (; operator : X -> Y ; purpose statement for operator (define (operator x)...)) (map operator lst))) Here is the pattern for a use of map. It is necessary to fill in the right data definitions for X and Y. It isn t necessary to make the operator a local function or lambda, but if you do, you must write a contract and purpose statement (also examples if they are needed to clarify purpose). 18

Or you could use lambda ;; list-fn : ListOfX -> ListOfY (define (list-fn lst) (map ; X -> Y ; purpose statement for operator (lambda (x)...)) lst))) 19

Example ;; STRATEGY: Use template for ListOfNumber on lon (define (add-x-to-each x lon) (cond [(empty? lon) empty] [(else (cons (+ x (first lon)) (add1-to-each x (rest lon))))])) ;; strategy: Use HOF map on lon. (define (add-x-to-each x lon) (map ;; Number -> Number (lambda (n) (+ x n)) lon)) This one is so simple you don't need a purpose statement for the lambda. Here's an original function, and what we get after we've converted it to use map. Here I've used lambda, but that isn't necessary. 20

Pattern for using a HOF: filter ;; list-fn : ListOfX -> ListOfX (define (list-fn lst) (local (; X -> Boolean ; purpose statement for test (define (test x)...)) (filter test lst))) Similarly, here is the pattern for a use of filter. 21

Or you could use lambda ;; list-fn : ListOfX -> ListOfX (define (list-fn lst) (filter ; X -> Boolean ; purpose statement for the test (lambda (x)...) lst)) 22

Pattern for using an HOF: andmap/ormap ;; list-fn : ListOfX -> Boolean (define (list-fn lst) (local (; X -> Boolean ; purpose statement for test (define (test x)...)) (andmap/ormap test lst))) Either andmap or ormap. 23

Using an HOF with lambda : andmap/ormap ;; list-fn : ListOfX -> Boolean (define (list-fn lst) (andmap/ormap ; X -> Boolean ; purpose statement for the test (lambda (x)...) lst)) 24

Pattern for using an HOF: foldr ;; list-fn : ListOfX -> Y (define (list-fn lst) (local (; X Y -> Y ; purpose statement for combiner (define (combiner x y)...)) (foldr combiner base-val lst))) Finally, here is the pattern for a use of foldr. 25

Pattern for using an HOF with lambda: foldr ;; list-fn : ListOf<X> -> Y (define (list-fn lst) (foldr ; X Y -> Y ; purpose statement for combiner (lambda (first-elt ans-for-rest)...) base-val lst)) These variable names remind you where the values come from. 26

Recognizing Opportunities for using HOF's Once you get the idea, you can anticipate when you can use an HOF, and apply it directly. If your function treats all members of the list in the same way, then your function is a candidate. remove-evens --Yes, all elements are included if they are even. count-trues --Yes, all elements are counted if they are true. remove-first-even --No, elements after the first even are treated differently. 27

What s the strategy? From now on, you can use HOFs anywhere. So you could write (filter some-fcn (robot-history r)) For your strategy you could write Use template for Robot on r OR Use HOF filter on (robot-history r) Either would be OK. Use whichever one best describes how your whole function works. 28

Which HOF should I use? Key: look at the contracts Here's a recipe, followed by a video demonstration 29

Recipe for Using a Higher-Order Function to process a list 1. Write the contract, purpose statement, and examples for your function. Does your function process a list? Does it treat all members of the list in more or less the same way? 2. Choose a function from Chapter 18 whose contract matches yours. What choices for X, Y, etc. match your contract? 3. Create a copy of the pattern for the function. What is the contract for the combiner? What is its purpose? 4. Define the combiner function. 5. Test as usual. 30

Video Demonstration: Using an HOF (part 1) https://www.youtube.com/watch?v=wzbt8637-um&feature=youtu.be Remember: We don't write ListOf<X> any more; we write ListOfX instead. 31

Video Demonstration: Using an HOF (part 2) https://www.youtube.com/watch?v=g0x6okvub40&feature=youtu.be 32

Summary You should now be able to: Use pre-built HOFs for processing lists found in ISL. Recognize the pre-built HOF that's appropriate for your function. Follow the recipe for converting your use of a template into a use of an HOF 33

Next Steps Study 05-4-sets.rkt in the Examples folder. If you have questions about this lesson, ask them on the Discussion Board. Do Guided Practice 5.5 Do Problem Set 5. 34