Functional Programming Languages
Functional Programming Languages
Introduction
The design of the imperative languages is based directly on the von Neumann
architecture
Efficiency is the primary concern, rather than the suitability of the language for software development
Mathematical Functions
A mathematical function is a mapping of members of one set, called the domain set, to another set, called the range set A lambda expression specifies the parameter(s) and the mapping of a function in the following form (x) x * x * x for the function cube(x) = x * x * x
1-3
Lambda Expressions
Lambda expressions describe nameless functions Lambda expressions are applied to parameter(s) by placing the parameter(s) after the expression e.g., ((x) x * x * x)(2) which evaluates to 8
1-4
Function Composition
A functional form that takes two functions as parameters and yields a function whose value is the first actual parameter function applied to the application of the second Form: h f g which means h (x) f ( g ( x)) For f (x) x + 2 and g (x) 3 * x, h f g yields (3 * x)+ 2
1-5
Apply-to-all
A functional form that takes a single function as a parameter and yields a list of values obtained by applying the given function to each element of a list of parameters Form: For h(x) x * x (h, (2, 3, 4)) yields (4, 9, 16)
1-6
In an FPL, variables are not necessary, as is the case in mathematics Referential Transparency - In an FPL, the evaluation of a function always produces the same result given the same parameters
1-7
1-8
LISP Interpretation
Lambda notation is used to specify functions and function definitions. Function applications and data have the same form. e.g., If the list (A B C) is interpreted as data it is a simple list of three atoms, A, B, and C If it is interpreted as a function application, it means that the function named A is applied to the two parameters, B and C The first LISP interpreter appeared only as a demonstration of the universality of the computational capabilities of the notation
1-10
1-11
LAMBDA
Expressions
Primitive Arithmetic Functions: +, -, *, /, ABS, SQRT, REMAINDER, MIN, MAX e.g., (+ 5 2) yields 7
Lambda Expressions Form is based on notation e.g., (LAMBDA (x) (* x x) x is called a bound variable Lambda expressions can be applied to parameters e.g., ((LAMBDA (x) (* x x)) 7) yields 49 x:bound variable LAMBDA expressions can have any number of parameters (LAMBDA (a b x) (+ (* a x x) (* b x)))
1-12
2. To bind names to lambda expressions (LAMBDA is implicit) e.g., (DEFINE (square x) (* x x)) Example use: (square 5)displays 25 - The evaluation process for DEFINE is different! The first parameter is never evaluated. The second parameter is evaluated and bound to the first parameter.
1-13
Output Functions
Usually not needed, because the interpreter always displays the result of a function evaluated at the top level (not nested) Scheme has PRINTF, which is similar to the printf function of C Note: explicit input and output are not part of the pure functional programming model, because input operations change the state of the program and output operations are side effects
1-14
Output Functions
(DISPLAY expression) (NEWLINE)
1-15
(or #t) is true and #F (or #f) is false (sometimes () is used for false) =, <>, >, <, >=, <= EVEN?, ODD?, ZERO?, NEGATIVE?
1-16
Control Flow
Selection- the special form, IF (IF predicate then_exp else_exp)
(IF (<> count 0) (/ sum count) )
COND
function:
(DEFINE (leap? year) (COND ((ZERO? (MODULO year 400)) #T) ((ZERO? (MODULO year 100)) #F) (ELSE (ZERO? (MODULO year 4))) ))
1-17
Example of COND
(DEFINE (compare x y) (COND ((> x y) x is greater than y) ((< x y) y is greater than x) (ELSE x and y are equal) ) )
1-19
1-20
List Functions
QUOTE
QUOTE is required because the Scheme interpreter, named EVAL, always evaluates parameters to function applications before applying the function. QUOTE is used to avoid parameter evaluation when it is not appropriate QUOTE can be abbreviated with the apostrophe prefix operator '(A B) is equivalent to (QUOTE (A B))
1-22
1-23
List Functions
Examples:
(continued)
(CAR ((A B) C D)) returns (A B) (CAR A) is an error (CDR ((A B) C D)) returns (C D) (CDR A) is an error (CDR (A)) returns () (CONS () (A B)) returns (() A B) (CONS (A B) (C D)) returns ((A B) C D)
(CONS A B) returns (A . B)
(a dotted pair)
1-24
List Functions
(continued)
1-25
1-26
Predicate Function:
EQ?
EQ?
takes two expressions as parameters (usually two atoms); it returns #T if both parameters have the same pointer value; otherwise #F
(EQ? 'A 'A) yields #T
(EQ? 'A 'B) yields #F (EQ? 'A '(A B)) yields #F (EQ? '(A B) '(A B)) yields #T or #F (EQ? 3.4 (+ 3 0.4))) yields #T or #F
1-27
Predicate Function:
EQV?
EQV?
is like EQ?, except that it works for both symbolic and numeric atoms; it is a value comparison, not a pointer comparison
(EQV? 3 3) yields #T
different)
1-28
#T
if the
NULL?
takes one parameter; it returns #T if the parameter is the empty list; otherwise #F
(NULL? '(())) yields #F
1-29
otherwise
DEFINE (member atm a_list) (COND ((NULL? a_list) #F) ((EQ? atm (CAR lis)) #T) ((ELSE (member atm (CDR a_list))) ))
1-30
1-31
1-33
Functional Languages:
1-34
Summary
Functional programming languages use function application, conditional expressions, recursion, and functional forms to control program execution LISP began as a purely functional language and later included imperative features Scheme is a relatively simple dialect of LISP that uses static scoping exclusively Common LISP is a large LISP-based language ML is a static-scoped and strongly typed functional language that uses type inference Haskell is a lazy functional language supporting infinite lists and set comprehension. F# is a .NET functional language that also supports imperative and object-oriented programming Some primarily imperative languages now incorporate some support for functional programming Purely functional languages have advantages over imperative alternatives, but still are not very widely used
1-35