Lecture 8, July 5
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.
Our own list structures
(define-struct Num-list-Empty ()) (define-struct Num-list-Cons ([first : Number] [rest : Num-list])) (define-type Num-list (U Num-list-Empty Num-list-Cons)) (Num-list-Cons 2 (Num-list-Cons 3 (Num-list-Cons 5 (Num-list-Empty)))) ; sqr-num-list squares all the numbers in a Num-list (: sqr-num-list (Num-list -> Num-list)) (define (sqr-num-list l) (cond [(Num-list-Empty? l) (Num-list-Empty)] [else (Num-list-Cons (sqr (Num-list-Cons-first l)) (sqr-num-list (Num-list-Cons-rest l)))])) (define-struct My-Empty ()) (define-struct (My-Cons A) ([first : A] [rest : (My-list A)])) (define-type (My-list A) (U My-Empty (My-Cons A))) (: l : (Listof Number)) (define l (cons 3 (cons 4 empty))) (: new-list : (My-list Number)) (define new-list (My-Cons 3 (My-Cons 4 (My-Empty)))) (: n : Number) (define n 4) (: negate : ((My-list Number) -> (My-list Number))) (define (negate l) (cond [(My-Empty? l) (My-Empty)] [else (My-Cons (- (My-Cons-first l)) (negate (My-Cons-rest l)))]))
Polymorphic Types
(: append (All (A) (Listof A) (Listof A) -> (Listof A))) (define (append a b) (cond [(empty? a) b] [else (cons (first a) (append (rest a) b))])) (: flatten (All (A) (Listof (Listof A)) -> (Listof A))) (define (flatten l) (cond [(empty? l) empty] [else (append (first l) (flatten (rest l)))]))
Higher Order Programming
(: sqr-list ((Listof Number) -> (Listof Number))) (define (sqr-list l) (cond [(empty? l) empty] [else (cons (sqr (first l)) (sqr-list (rest l)))])) (: neg-list ((Listof Number) -> (Listof Number))) (define (neg-list l) (cond [(empty? l) empty] [else (cons (- (first l)) (neg-list (rest l)))])) (: list-upcase : (Listof String) -> (Listof String)) (define (list-upcase l) (cond [(empty? l) empty] [else (cons (string-upcase (first l)) (list-upcase (rest l)))])) (: str-lens : (Listof String) -> (Listof Integer)) (define (str-lens l) (cond [(empty? l) empty] [else (cons (string-length (first l)) (str-lens (rest l)))])) (: apply-fun : (All (A B) (Listof A) (A -> B) -> (Listof B))) (define (apply-fun l func) (cond [(empty? l) empty] [else (cons (func (first l)) (apply-fun (rest l) func))])) ; apply-fun is same as built in function map (: evens : (Listof Integer) -> (Listof Integer)) (define (evens l) (cond [(empty? l) empty] [(even? (first l)) (cons (first l) (evens (rest l)))] [else (evens (rest l))])) (: empties : (All (A) (Listof (Listof A)) -> (Listof (Listof A)))) (define (empties l) (cond [(empty? l) empty] [(empty? (first l)) (cons (first l) (empties (rest l)))] [else (empties (rest l))])) (: non-empty : (All (A) (Listof (Listof A)) -> (Listof (Listof A)))) (define (non-empty l) (cond [(empty? l) empty] [(cons? (first l)) (cons (first l) (non-empty (rest l)))] [else (non-empty (rest l))])) (: filter : (All (A) (A -> Boolean) (Listof A) -> (Listof A))) (define (filter func l) (cond [(empty? l) empty] [(func (first l)) (cons (first l) (filter func (rest l)))] [else (filter func (rest l))])) ; this definition shadows the built in filter function (: gt-5 : Real -> Boolean) (define (gt-5 n) (> n 5))
Polymorphic Structures
The My-List example above was also a polymorphic type. The My-Cons structure was a polymorphic structure.
(define-struct (Pair A B) ([a : A] [b : B])) (: swap : (All (A B) (-> (Pair A B) (Pair B A)))) (define (swap p) (Pair (Pair-b p) (Pair-a p)))
Functions as output
(: add2 : Number -> Number) (define (add2 x) (+ x 2)) (: add3 : Number -> Number) (define (add3 x) (+ x 3)) (: addn : Number -> (Number -> Number)) (define (addn n) (local {(: f (Number -> Number)) (define (f x) (+ x n))} f)) (: add4 : Number -> Number) (define add4 (addn 4)) (: quad-fun : Number Number Number -> (Number -> Number)) (define (quad-fun a b c) (local {(: f (Number -> Number)) (define (f x) (+ (* a x x) (* b x) c))} f))