COP 4020 Programming Languages Functional Programming Prof Xin

  • Slides: 16
Download presentation
COP 4020 Programming Languages Functional Programming Prof. Xin Yuan

COP 4020 Programming Languages Functional Programming Prof. Xin Yuan

Topics n Functional programming with Scheme ¨ 12/4/2020 Language constructs COP 4020 Spring 2014

Topics n Functional programming with Scheme ¨ 12/4/2020 Language constructs COP 4020 Spring 2014 2

Data Structures in scheme n n n An expression operates on values and compound

Data Structures in scheme n n n An expression operates on values and compound data structures built from atoms and lists A value is either an atom or a compound list Atoms are ¨ ¨ ¨ n Numbers, e. g. 7 and 3. 14 Characters: #a Strings, e. g. "abc" Boolean values #t (true) and #f (false) Symbols, which are identifiers escaped with a single quote, e. g. 'y The empty list () When entering a list as a literal value, escape it with a single quote Without the quote it is a function invocation! ¨ For example, '(a b c) is a list while (a b c) is a function application ¨ Lists can be nested and may contain any value, e. g. '(1 (a b) ''s'') ¨ 12/4/2020 COP 4020 Spring 2014 3

Checking the Type of a Value n The type of a value can be

Checking the Type of a Value n The type of a value can be checked with ¨ ¨ ¨ ¨ n (boolean? x) (char? x) (string? x) (symbol? x) (number? x) (list? x) (pair? x) (null? x) ; is x a Boolean? ; is x a character? ; is x a string? ; is x a symbol? ; is x a number? ; is x a list? ; is x a non-empty list? ; is x an empty list? Examples (list? '(2)) #t ¨ (number? ''abc'') #f ¨ n Portability note: on some systems false (#f) is replaced with () 12/4/2020 COP 4020 Spring 2014 4

Working with Lists n n n (car xs) returns the head (first element) of

Working with Lists n n n (car xs) returns the head (first element) of list xs (cdr xs) (pronounced "coulder") returns the tail of list xs (cons x xs) joins an element x and a list xs to construct a new list (list x 1 x 2 … xn) generates a list from its arguments Examples: ¨ ¨ ¨ ¨ ¨ 12/4/2020 (car '(2 3 4)) (car '(2)) (car '()) (cdr '(2 3)) (car (cdr '(2 3 4))) (cdr '(2)) (cons 2 '(3 4)) (list 1 2 3) COP 4020 Spring 2014 5

Working with Lists n n n (car xs) returns the head (first element) of

Working with Lists n n n (car xs) returns the head (first element) of list xs (cdr xs) (pronounced "coulder") returns the tail of list xs (cons x xs) joins an element x and a list xs to construct a new list (list x 1 x 2 … xn) generates a list from its arguments Examples: ¨ ¨ ¨ ¨ ¨ 12/4/2020 (car '(2 3 4)) 2 (car '(2)) 2 (car '()) Error (cdr '(2 3)) (3) (car (cdr '(2 3 4))) 3 (cdr '(2 3 4))) (4) (cdr '(2)) () (cons 2 '(3)) (2 3) (cons 2 '(3 4)) (2 3 4) (list 1 2 3) (1 2 3) ; also abbreviated as (cadr '(2 3 4)) ; also abbreviated as (cddr '(2 3 4)) COP 4020 Spring 2014 6

How to represent some common data structure? n Everything is a list: ¨ Array?

How to represent some common data structure? n Everything is a list: ¨ Array? int A[4]= {1, 2, 3, 4} ¨ 2 -d array: int a[4][4] = {{0, 0, 0, 0}, {1, 1, 1 , 1}, {2, 2, 2, 2}, {3, 3, 3, 3}} ¨ Structure (array)? struct ex {int a; char b; } ¨ An array of a structure? struct ex {int a; char b; } aa[3] = {{10, ‘a’}, {20, ‘b’}, {30, ‘c’}}; ¨ A tree? n n Can use pre-order traversal list form (root left_tree right_tree) The major difference between scheme data structures and C++ data structures? -- no random access mechanism, list items are mostly accessed through car and cdr functions. 12/4/2020 COP 4020 Spring 2014 7

The “if” Special Form n Special forms resemble functions but have special evaluation rules

The “if” Special Form n Special forms resemble functions but have special evaluation rules ¨ n Evaluation of arguments depends on the special construct The “if” special form returns the value of thenexpr or elseexpr depending on a condition (if condition thenexpr elseexpr) n Examples (if #t 1 2) ¨ (if #f 1 "a") ¨ (if (string? "s") (+ 1 2) 4) ¨ (if (> 1 2) "yes" "no") ¨ 12/4/2020 COP 4020 Spring 2014 8

The “if” Special Form n Examples (if #t 1 2) 1 ¨ (if #f

The “if” Special Form n Examples (if #t 1 2) 1 ¨ (if #f 1 "a") "a" ¨ (if (string? "s") (+ 1 2) 4) 3 ¨ (if (> 1 2) "yes" "no") "no" ¨ 12/4/2020 COP 4020 Spring 2014 9

The “cond” Special Form n A more general if-then-else can be written using the

The “cond” Special Form n A more general if-then-else can be written using the “cond” special form that takes a sequence of (condition value) pairs and returns the first value xi for which condition ci is true: n (cond (c 1 x 1) (c 2 x 2) … (else xn) ) Note: “else” is used to return a default value n Examples (cond (#f 1) (#t 2) (#t 3) ) ¨ (cond ((< 1 2) ''one'') ((>= 1 2) ''two'') ) ¨ (cond ((< 2 1) 1) ((= 2 1) 2) (else 3) ) ¨ (cond (#f 1) (#f 2)) ¨ 12/4/2020 COP 4020 Spring 2014 10

The “cond” Special Form n Examples (cond (#f 1) (#t 2) (#t 3) )

The “cond” Special Form n Examples (cond (#f 1) (#t 2) (#t 3) ) 2 ¨ (cond ((< 1 2) ''one'') ((>= 1 2) ''two'') ) ''one'' ¨ (cond ((< 2 1) 1) ((= 2 1) 2) (else 3) ) 3 ¨ (cond (#f 1) (#f 2)) error (unspecified value) ¨ 12/4/2020 COP 4020 Spring 2014 11

Logical Expressions n Relations ¨ n Boolean operators ¨ n Numeric comparison operators <,

Logical Expressions n Relations ¨ n Boolean operators ¨ n Numeric comparison operators <, <=, =, >, >= (and x 1 x 2 … xn), (or x 1 x 2 … xn) Other test operators (zero? x), (odd? x), (even? x) ¨ (eq? x 1 x 2) tests whether x 1 and x 2 refer to the same object (eq? 'a 'a) #t (eq? '(a b)) #f ¨ (equal? x 1 x 2) tests whether x 1 and x 2 are structurally equivalent (equal? 'a 'a) #t (equal? '(a b)) #t ¨ (member x xs) returns the sublist of xs that starts with x, or returns () (member 5 '(a b)) () (member 5 '(1 2 3 4 5 6)) (5 6) ¨ 12/4/2020 COP 4020 Spring 2014 12

Lambda Calculus: Functions = Lambda Abstractions n A lambda abstraction is a nameless function

Lambda Calculus: Functions = Lambda Abstractions n A lambda abstraction is a nameless function (a mapping) specified with the lambda special form: (lambda args body) n n where args is a list of formal arguments and body is an expression that returns the result of the function evaluation when applied to actual arguments A lambda expression is an unevaluated function Examples: (lambda (x) (+ x 1)) ¨ (lambda (x) (* x x)) ¨ (lambda (a b) (sqrt (+ (* a a) (* b b)))) ¨ 12/4/2020 COP 4020 Spring 2014 13

Lambda Calculus: Invocation = Beta Reduction n n A lambda abstraction is applied to

Lambda Calculus: Invocation = Beta Reduction n n A lambda abstraction is applied to actual arguments using the familiar list notation (function arg 1 arg 2. . . argn) where function is the name of a function or a lambda abstraction Beta reduction is the process of replacing formal arguments in the lambda abstraction’s body with actuals ¨ n Defined in terms of substitution: ((λV. E) E′) is E[V : = E′] Examples ( (lambda (x) (* x x)) 3 ) (* 3 3) 9 ¨ ( (lambda (f a) (f (f a))) (lambda (x) (* x x)) 3 ) (f (f 3)) where f = (lambda (x) (* x x)) (f ( (lambda (x) (* x x)) 3 )) where f = (lambda (x) (* x x)) (f 9) where f = (lambda (x) (* x x)) ( (lambda (x) (* x x)) 9 ) (* 9 9) 81 ¨ 12/4/2020 COP 4020 Spring 2014 14

More Lambda abstractions n Define a lambda abstraction that takes three parameters and returns

More Lambda abstractions n Define a lambda abstraction that takes three parameters and returns the maximum value of the three. n Define a lambda abstraction that takes two parameters, one scheme arithmetic expression (e. g. (+ 1 2 4)), and the other one a number. The function return true (#t) if the expression evaluate to the number, false (#f) otherwise. 12/4/2020 COP 4020 Spring 2014 15

More Lambda abstractions n Define a lambda abstraction that takes three parameters and returns

More Lambda abstractions n Define a lambda abstraction that takes three parameters and returns the maximum value of the three. ¨ n Define a lambda abstraction that takes two parameters, one scheme arithmetic expression (e. g. (+ 1 2 4)), and the other one a number. The function return true (#t) if the expression evaluate to the number, false (#f) otherwise. ¨ n (lambda (x y z) (if (> x y) (if (> x z) (if (> y z))) (lambda (x y) (if (equal? x y) #t #f) Functions are used much more liberally in scheme (compared to C++); the boundary before data and program is not as clear as in C++. 12/4/2020 COP 4020 Spring 2014 16