Lecture 9, July 7
The lecture notes I post serve two purposes: to remind you of the topics we discussed and to provide any interesting code examples I did during lecture. I would describe these notes as an outline, not a summary, of what I talked about during lecture. You are not expected to be able to learn the material simply from examining these notes, nor is reading these notes a reasonable substitute for attending lecture.
Higher order programming
The following five functions are important to know:- (: build-list : (All (A) (Nonnegative-Integer (Nonnegative-Integer -> A) -> (Listof A))))
- (: filter : (All (A) (A -> Boolean) (Listof A) -> (Listof A)))
- (: map : (All (A) (A -> B) (Listof A) -> (Listof B)))
- (: foldr : (All (A B) (A B -> B) B (Listof A) -> B))
- (: foldl : (All (A B) (A B -> B) B (Listof A) -> B))
In class exercise
#lang typed/racket (require "../include/uchicago151.rkt") ;Write squares to give the list of the first squares ; (squares 5) => '(0 1 4 9 16) (: squares : Nonnegative-Integer -> (Listof Nonnegative-Integer)) (define (squares n) (build-list n sqr)) ;Write odd-list to give the list of the first odd numbers ; (odd-list 5) => '(1 3 5 7 9) (: odd-list : Nonnegative-Integer -> (Listof Nonnegative-Integer)) (define (odd-list n) (local {(: odd : Nonnegative-Integer -> Nonnegative-Integer) (define (odd n) (add1 (* 2 n)))} (build-list n odd))) ;Write magnitudes to compute the magnitudes of a list of vectors ; (magnitudes (list (Point 3 4) (Point 0 3) (Point 5 12))) ; => (list 5 3 13) (define-struct Point ([x : Real] [y : Real])) (: magnitudes : (Listof Point) -> (Listof Number)) (define (magnitudes l) (local {(: mag : Point -> Number) (define (mag p) (sqrt (+ (sqr (Point-x p)) (sqr (Point-y p)))))} (map mag l))) ;Write scale that takes a list of Points and a Real and scales the ; points by that number ; (scale (list (Point 3 5) (Point 7 2) (Point 6 0)) 2) ; => (list (Point 6 10) (Point 14 4) (Point 12 0)) (: scale : (Listof Point) Real -> (Listof Point)) (define (scale l n) (local {(: scale-pt : Point -> Point) (define (scale-pt p) (Point (* n (Point-x p)) (* n (Point-y p))))} (map scale-pt l))) ;Write scale/xy that takes a list of Points and two Reals and scales the ; points x and y coordinates by those numbers ; (scale (list (Point 3 5) (Point 7 2) (Point 6 0)) 2 3) ; => (list (Point 6 15) (Point 14 6) (Point 12 0)) (: scale/xy : (Listof Point) Real Real -> (Listof Point)) (define (scale/xy l nx ny) (local {(: scale-pt : Point -> Point) (define (scale-pt p) (Point (* nx (Point-x p)) (* ny (Point-y p))))} (map scale-pt l))) ;Write odds to remove all the evens from a list ; (odds '(1 4 3 6 8 7)) => '(1 3 7) (: odds : (Listof Integer) -> (Listof Integer)) (define (odds l) (filter odd? l)) ;Write gt-10 to keep only the numbers greater than 10 ; (gt-10 '(15 3 -20 11)) => '(15 11) (: gt-10 : (Listof Integer) -> (Listof Integer)) (define (gt-10 l) (local {(: t : Integer -> Boolean) (define (t x) (> x 10))} (filter t l))) ;Write exact-squares to keep only the numbers that are exact squares ; - the numbers with exact integer square roots ; (exact-squares '(1 4 5 24 16)) => '(1 4 16) (: exact-squares : (Listof Number) -> (Listof Number)) (define (exact-squares l) (local {(: exact-square : Number -> Boolean) (define (exact-square n) (exact-integer? (sqrt n)))} (filter exact-integer? l))) ;Write sum to add a list of numbers ; (sum '(1 2 3)) => 6 (: sum : (Listof Number) -> Number) (define (sum l) (foldr + 0 l)) ;Write append-strings to append a list of strings together into one string ; (append-strings '("Hi" "Cat" "Dog")) => "HiCatDog" (: append-strings : (Listof String) -> String) (define (append-strings l) (foldr string-append "" l)) ;Last lecture I did map and filter as examples ;Do build-list, foldr, and foldl now. (: build-list : (All (A) (Nonnegative-Integer (Nonnegative-Integer -> A) -> (Listof A)))) (define (build-list n f) (local {(: helper : Nonnegative-Integer -> (Listof A)) (define (helper i) (cond [(= i n) empty] [else (cons (f i) (helper (add1 i)))]))} (helper 0))) (: foldr : (All (A B) (A B -> B) B (Listof A) -> B)) (define (foldr f i l) (cond [(empty? l) i] [else (f (first l) (foldr f i (rest l)))])) (: foldl : (All (A B) (A B -> B) B (Listof A) -> B)) (define (foldl f i l) (cond [(empty? l) i] [else (foldl f (f (first l) i) (rest l))]))