Functional Programming Languages: Characteristics, Lambda Calculus, and Scheme Overview, Study notes of Computer Science

An overview of functional programming languages (fpls), focusing on their characteristics, lambda calculus, and the scheme programming language. Fpls are categorized into pure and impure types, with applications in ai, symbolic computation, and editing environments. The concept of mathematical functions, functional forms, and the use of conditional expressions and recursion for iteration.

Typology: Study notes

Pre 2010

Uploaded on 08/18/2009

koofers-user-7iu-1
koofers-user-7iu-1 🇺🇸

10 documents

1 / 28

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Functional Programming Languages (FPL)
1. Definitions 2
2. Applications 2
3. Examples 3
4. FPL Characteristics: 3
5. Lambda calculus (LC) 5
6. Functions in FPLs 7
7. Modern functional languages 9
8. Scheme overview 11
8.1. Get your own Scheme from MIT...........................11
8.2. General overview...................................................11
8.3. Data Typing...........................................................12
8.4. Comments..............................................................12
8.5. Recursion Instead of Iteration................................13
8.6. Evaluation..............................................................14
8.7. Storing and using Scheme code.............................14
8.8. Variables................................................................15
8.9. Data types...............................................................16
8.10. Arithmetic functions...........................................17
8.11. Selection functions..............................................18
8.12. Iteration................................................................23
8.13. Defining functions..............................................24
9. ML 25
10. Haskell 26
A. Bellaachia Page: 1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c

Partial preview of the text

Download Functional Programming Languages: Characteristics, Lambda Calculus, and Scheme Overview and more Study notes Computer Science in PDF only on Docsity!

Functional Programming Languages (FPL)

    1. Definitions
    1. Applications
    1. Examples
    1. FPL Characteristics:
    1. Lambda calculus (LC)
    1. Functions in FPLs
    1. Modern functional languages
    1. Scheme overview
    • 8.1. Get your own Scheme from MIT...........................
    • 8.2. General overview...................................................
    • 8.3. Data Typing...........................................................
    • 8.4. Comments..............................................................
    • 8.5. Recursion Instead of Iteration................................
    • 8.6. Evaluation..............................................................
    • 8.7. Storing and using Scheme code.............................
    • 8.8. Variables................................................................
    • 8.9. Data types...............................................................
    • 8.10. Arithmetic functions...........................................
    • 8.11. Selection functions..............................................
    • 8.12. Iteration................................................................
    • 8.13. Defining functions..............................................
    1. ML
    1. Haskell

1. Definitions

Functional programming languages were originally developed

specifically to handle symbolic computation and list-

processing applications.

In FPLs the programmer is concerned only with functionality,

not with memory-related variable storage and assignment

sequences.

 FPL can be categorized into two types;

 PURE functional languages, which support only the

functional paradigm (Haskell), and

 Impure functional languages that can also be used for

writing imperative-style programs (LISP).

2. Applications

 AI is the main application domain for functional

programming, covering topics such as:

expert systems

knowledge representation

machine learning

natural language processing

modelling speech and vision

value, there are no variables to manipulate and hence no

possibility for side effects.

 Programs are constructed by composing function

applications - the values produced by one or more functions

become the parameters to another.

 For reasons of efficiency (because the underlying machine

is, in fact, imperative) most functional languages provide

some imperative-style capabilities, including variables with

assignment, sequences of statements, and imperative style

loop structures.

 Note that the functional paradigm can also be used with

some imperative languages - e.g. C has both a conditional

expression and support for recursion - so the factorial

function code be coded in functional style in C (or C++ or

Java) as follows:

int fact(int x)

{ return (x == 0)? 1 : x * fact(x - 1); }

 Three primary components:

 A set of data object: A single, high-level

data structure like a list

 A set of built-in functions for object

manipulation: Building, deconstructing,

and accessing lists

 A set of functional forms for building

new functions: Composition, reduction,

etc.

5. Lambda calculus (LC)

 A method of modeling the computational aspects of

functions

 It helps us understand the elements and semantics of

functional programming languages independent of

syntax

 LC expressions are of three forms:

e1 : A single identifier (such as x , or 3 )

e2 : A function definition of the form

(x.e)

 The expression e , with x being a

bound variable

e is the body of the function, x

is a parameter

e may be any of the three types

of expressions

square( x ) would be written as

(x.xx)*

e3 : A function application of the form

e1 e

Meaning e1 applied e

square applied to 2 would be

((x.xx) 2)*

Free and Bound Variables:

A variable appearing in a function F is

said to be free if it is not bound in F

Bound variables are like formal

parameters, and act like local variables

r1 : Renaming

  x i

.e   x j

.[x j

/x i

]e , where x j

is not

free in e

 We can replace all occurrences of the

name of a bound variable with

another name without changing the

meaning

r2 : Application

(x.e1)e2[e2/x]e

 Replace the bound variable with the

argument to the application

r3 : Redundant function elimination

  x.(e x)e , if x is not free in e

An expression that can no longer be

reduced is said to be in normal

form:

  • (x.(y.x + y) 5)((y.y * y) 6) =
  • (x.x + 5)((y.y * y) 6) =
  • (x.x + 5)(6 * 6) =

6. Functions in FPLs

In a functional language, the basic unit of computation is the

FUNCTION.

 The function definitions typically include a name for the

function, its associated parameter list, and the expressions

used to carry out the computation.

A function computes a single value based on 0 or more

parameters.

 Though the parameters of a function look like

variables in an imperative language, they are

different in that they are not subject to having

their value changed by assignment - i.e. they

retain their initial value throughout the

computation of the function.

 Pure functional languages don't need an

assignment statement.

Function construction : given one or more functions as

parameters, as well as a list of other parameters,

construction essentially calls each function and passes it the

list of "other" parameters.

Function composition : applying one function to the result

of another. E.g. square_root(absolute_value(-3))

Apply-to-all functions : takes a single function as a

parameter along with list of operand values. It then applies

the function to each parameter, and returns a list containing

the results of each call.

Example:

IPL vs. FPL

 Note that in imperative programming we concern ourselves

with both the computation sequence and maintaining the

program state (i.e. the collection of current data values).

 Unlike IPLs, purely functional languages (no variables and

hence no assignments) have no equivalent concept of state:

the programmer focuses strictly on defining the desired

functionality.

 Iteration is not accomplished by loop statements, but rather

by conditional recursion.

 Functional programmers are concerned only with

functionality. This comes at a direct cost in terms of

efficiency, since the code is still translated into something

running on Von Neuman architecture.

8. Scheme overview

8.1. Get your own Scheme from MIT

swissnet.ai.mit.edu/projects/scheme/index.html

8.2. General overview

Scheme is a functional programming language

Scheme is a small derivative of LISP:

LIS t P rocessing

Dynamic typing and dynamic scooping

Scheme introduced static scooping

 Data Objects

 An expression is either an atom or a list

 An atom is a string of characters

A

Austria

; and finally for (2+3)-(2*2)

; we'll start the statements to be evaluated

; on the next line

; Value: 5

; Value: 11

; Value: 1

8.5. Recursion Instead of Iteration

 Since we are expressing the entire computation as a

composition of functions into a single function,

recursion is usually used rather than iteration

 Example:

; the first line is the header for the Fibonacci

function:

(define Fibonacci (lambda (n)

; next is the termination case

( if (< n 3) 1

; and the recursive cal

(+ (Fibonacci (- n 1)) (Fibonacci (- n 2))))))

(Fibonacci 6)

; Value: 8

8.6. Evaluation

 The functional approach sometimes requires us to

take a "bottom-up" view of the problem: creating

functions to compute the lowest layer of values,

then other functions taking those as operands.

 Example: Design a code to compute (a + b + c) / (x

  • y + z)

 Compute the numerator and denominator

separately,

; for the numerator

(+ a b c)

; for the denominator

(+ x y z)

and then decide how to apply division with those

two functions as operands, i.e.:

(/ (+ a b c) (+ x y z))

8.7. Storing and using Scheme code

The load function is available to load a Scheme

program stores in a an text file, e.g.:

(load "myfile.txt")

; Loading "myfile.txt" -- done

8.9. Data types

Literals are described as self-evaluating , in that

evaluating the literal returns the value they

represent. (E.g. evaluating 3 returns the

integer value 3.)

The primitive types are:

characters

strings (in double-quotes)

Booleans:

True: #t

False: The empty set for false or

#f (see example below).

Integers

rational numbers

real numbers

complex numbers.

List: There is also a composite data type,

called the list, which is a fundamental part

of Scheme. Lists are considered in detail in a

later section.

 Numbers

There are integers, rationals, reals, and complex

numbers.

In general, Scheme will return as exact an answer as it

can (i.e. it will give an exact integer or rational over a

real approximation).

Examples:

Let's see the results of some basic arithmetic:

(/ 3.2 1.6)

; Value: 2.

(/ 16 10)

; Value: 8/

Suppose we were to try some comparisons:

(< 2 3)

; Value: #t

(< 4 3)

; Value: ()

8.10. Arithmetic functions

There are many built-in arithmetic functions. Some of

the commonly used ones include:

max, min

quotient, modulo, remainder

ceiling, floor, abs, magnitude, round, truncate

gcd, lcm

exp, log, sqrt

sin, cos, tan

There are also a number of comparison

operators returning Boolean values

 Selection in a functional language still controls the choice

between different computations, but is expressed by

returning the results of functions representing the different

computations.

 The two major Boolean control operations are:

IF

COND.

 IF:

For example, suppose if x is less than 0 we

want to return y - x: (if (< x 0) (- y x))

Now suppose that if x is less than 0 we want

to return 0, otherwise we want to return the

value x - 1:

(if (< x 0) 0

(- x 1))

 COND statement is somewhat like the C switch

statement, allowing a series of conditions to test for (with

corresponding functions to evaluate and return) and a

default case:

(cond ((= x y) 0)

((> x y) 1)

(else -1)

 Lists

 Lists are the main composite data type in Scheme.

 Lists are composed of a series of elements, enclosed

in brackets.

Implementation note: the typical implementation

format for lists is to represent each element in a list

using two pointers:

 One points to the actual implementation of

the element (hence allowing us to use

anything we like as a list element, the

pointer can refer to a primitive data element,

a list, a string, etc)

 The other points to the next element in the

list

 Example:

 (a b c d) has the four elements a, b, c, and d.

 The empty list is denoted ()

 Examples of lists include

'(a) ; a list with a single element

'(a b c) ; a list with three elements

'() ; an empty, or null, list

'((a b)) ; a list with a single element, which

happens to be another list