Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative...
Transcript of Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative...
![Page 1: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/1.jpg)
Principles of Programming LanguagesIntroduction & Chapter 1: Practical FunctionalProgramming
1/110
![Page 2: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/2.jpg)
Table of Contents
Introduction: What This Course is About
Chapter 1: Practical Functional Programming
Programming Paradigms
Functional Programming
Advantages of FP
Using JavaScript to Illustate FP
2/110
![Page 3: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/3.jpg)
Introduction: What This Course isAbout
![Page 4: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/4.jpg)
In One Sentence
This course studies principlesunderlying the design of programming
languages.
3/110
![Page 5: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/5.jpg)
Main Objectives
1. Learning principles of programming languages:• Elements of programming languages• Abstraction means• Formal definition• Concrete and abstract syntax, operational semantics• program correctness - type checking and type inferencesystems
Key concepts in describing programming languages willemerge such as substitution, scope, reduction andstructural induction. These tools will help us draft firstproofs of correctness for programs and programtransformations
4/110
![Page 6: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/6.jpg)
Main Objectives
2. Describing program execution by studying evaluators:interpreters, program transformers and compilers.
3. Comparing programming paradigms: Functionalprogramming, Logic programming and Imperativeprogramming.
4. Learning principles of program design: Abstraction,contracts, modular architecture, testing.
5/110
![Page 7: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/7.jpg)
Main Objectives
2. Describing program execution by studying evaluators:interpreters, program transformers and compilers.
3. Comparing programming paradigms: Functionalprogramming, Logic programming and Imperativeprogramming.
4. Learning principles of program design: Abstraction,contracts, modular architecture, testing.
5/110
![Page 8: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/8.jpg)
Main Objectives
2. Describing program execution by studying evaluators:interpreters, program transformers and compilers.
3. Comparing programming paradigms: Functionalprogramming, Logic programming and Imperativeprogramming.
4. Learning principles of program design: Abstraction,contracts, modular architecture, testing.
5/110
![Page 9: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/9.jpg)
Main Objectives
The unifying underlying objective is tounderstand how programming languages work,why they are designed the way they are, and
what good programming practices theyencourage.
6/110
![Page 10: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/10.jpg)
Main Objectives
Understanding these principles ofprogramming languages will help us learn newlanguages, compare existing languages, choosethe right language for a given task, and build
our own language when needed.
7/110
![Page 11: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/11.jpg)
How Will We Learn?
The course is a mixture of theory and practice.Theoretical topics are supported by
implemented software, and course assignmentsinvolve programming.
8/110
![Page 12: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/12.jpg)
Meta-programming
Describing and developing software tools thatmanipulate programs - parse them, evaluatethem, transform them, translate from onelanguage to another; reason about code toprove that it has some desirable properties(related to correctness or performance) in a
predictable manner.
9/110
![Page 13: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/13.jpg)
Meta-programming
Specifically, we will learn how to developinterpreters for a functional language, and aprogram transformer which infers types of anuntyped program and rewrites it into a typedform. We will also develop an interpreter for a
logic programming language.
10/110
![Page 14: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/14.jpg)
Good Programming Practices
Encourage good programming practices andunderstand their importance through
examples, and by applying them to developmeta-programming tools. The parsers,
interpreters and transformers of programs wewill develop will be practical examples of good
programming.
11/110
![Page 15: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/15.jpg)
Let’s Begin
Now that we know what we are gettingourselves into, let’s begin!
12/110
![Page 16: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/16.jpg)
Chapter 1: Practical FunctionalProgramming
![Page 17: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/17.jpg)
Motivation
In this chapter, we introduce the functionalprogramming paradigm and explain its benefits.
13/110
![Page 18: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/18.jpg)
Motivation
We illustrate the recommended practices withthe TypeScript programming language - whichis an extension of JavaScript which supports anadvanced type system. We introduce the notion
of type systems, type checking and typeinference on practical examples. We illustrate
through examples closures, higher orderfunctions, currying, and recursive programming.
14/110
![Page 19: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/19.jpg)
Chapter 1: Practical FunctionalProgramming
Programming Paradigms
![Page 20: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/20.jpg)
Definition
A programming paradigm is a way ofprogramming - that recommends “preferred
practices” and discourages or makesimpossible “risky practice.”
15/110
![Page 21: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/21.jpg)
Imperative
Control flow is an explicit sequence ofcommands.
10 INPUT "What is your name: "; U$20 PRINT "Hello "; U$30 INPUT "How many stars do you want: "; N40 S$ = ""50 FOR I = 1 TO N60 S$ = S$ + "*"70 NEXT I80 PRINT S$90 INPUT "Do you want more stars? "; A$100 IF LEN(A$) = 0 THEN GOTO 90110 A$ = LEFT$(A$, 1)120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30130 PRINT "Goodbye "; U$140 END
16/110
![Page 22: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/22.jpg)
Declarative
Programs state the result you want, not how toget it - leaves flexibility to the language runtime
to achieve the goal in optimized ways.
SELECT T1.country_nameFROM countries as T1 JOIN continentsAS T2 ON T1.continent = T2.cont_idJOIN car_makers as T3 ONT1.country_id = T3.countryWHERE T2.continent = 'Europe'GROUP BY T1.country_nameHAVING COUNT(*) >= 3
17/110
![Page 23: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/23.jpg)
Structured
Programs have clean, goto-free, nested controlstructures - arose in reaction to “goto hell”
spaghetti code.
18/110
![Page 24: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/24.jpg)
Procedural
Imperative programming organized aroundhierarchies of nested procedure calls.
int main(int argc, char *argv[]) {int x = 5;
int result1 = doStepOne(x);double result2 = doStepTwo(result1);printf("The result is %.2f", result2);
return 0;}
19/110
![Page 25: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/25.jpg)
Functional
Computation proceeds by (nested) functioncalls that avoid any global state mutation andthrough the definition of function composition.
(define sum-even-squares(foldl + 0
(filter even?(map sqr '(1 2 3 4 5)))))
20/110
![Page 26: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/26.jpg)
Object-oriented
Computation is effected by sending messagesto objects; objects encapsulate state and
exhibit behavior.public class Person {public Person(String name, int age) {
this.name = name;this.age = age;
}
public void sayHello() {System.out.println("Hello, my name is " + name);
}}
21/110
![Page 27: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/27.jpg)
Event-driven
Control flow is determined by asynchronousactions in reaction to events.
document.addEventListener("click", e => {console.log(`I was clicked at (${e.x}, ${e.y})`);
});
22/110
![Page 28: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/28.jpg)
Logic
Programmer specifies a set of facts and rules,and an engine infers the answers to questions.
male(ben).female(dor).teacher(ben, ppl).teacher(dor, ppl).
?- teacher(X, ppl), female(X).X = dor.
23/110
![Page 29: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/29.jpg)
Relation Between Paradigms and Languages
Programming Languages, by the way they aredesigned, make some programming paradigmseasy to follow. When this is the case, we saythat the language belongs to the paradigm.
For example, Scheme is a functionalprogramming language.
24/110
![Page 30: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/30.jpg)
Relation Between Paradigms and Languages
In other words, programming paradigms are away to classify programming languages (a
paradigm is a family of programming languagesthat have similar properties)
25/110
![Page 31: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/31.jpg)
Relation Between Paradigms and Languages
A given programming language can supportmore than one programming paradigm. Forexample, C++ and Java are multi-paradigm
languages, which support the Object-orientedparadigm, the Procedural paradigm, and in
recent versions some aspect of the Functionalparadigm.
26/110
![Page 32: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/32.jpg)
Dimensions of Variability Across Programming Paradigms
Paradigms are distinguished by programmingpractices they encourage and forbid (or makedifficult). Historically, new paradigms emerge in
reaction to problems faced over time bystandard practitioners. The motivating forcesand programming practices that are concerned
by programming paradigms include:
27/110
![Page 33: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/33.jpg)
Dimensions of Variability Across Programming Paradigms
• Control Flow: how execution flows within the program(sequence and branches, in concurrent threads, inreactive manner, declarative).
• Code Organization: how code is organized into a hierarchyof units (expressions, functions, modules, packages) andhow these units are organized.
• Performance: how code can be run fast, use lessresources (RAM, disk, network), behave better (responsive,scalable) at runtime.
28/110
![Page 34: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/34.jpg)
Dimensions of Variability Across Programming Paradigms
• Coupling and Reuse: how easily code can be reused indifferent contexts.
• Testing: how easy it is to test and verify that code iscorrect.
• Syntax: how natural, brief, readable is the expression ofcode given the syntax of the language. Can the syntax oflanguage be extended by the programmer.
• Domain: to which application domain is the paradigmbest applicable (server-side processing, database, GUIfront-end, control system).
29/110
![Page 35: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/35.jpg)
Chapter 1: Practical FunctionalProgramming
Functional Programming
![Page 36: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/36.jpg)
Introduction
We will start our investigation of programminglanguage principles by studying a specific
paradigm - called Functional Programming (FP).We will first illustrate practical applications of
this paradigm using JavaScript.
30/110
![Page 37: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/37.jpg)
Introduction
Functional Programming (FP) is a paradigm ofprogramming that is most similar to evaluation
of expressions in mathematics.
A program is viewed as an expression, which isevaluated by successive applications of
functions to their arguments, and substitutionof the result for the functional expression.
Its origin is in the lambda calculus invented byChurch in the 1930s.
31/110
![Page 38: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/38.jpg)
Expressions and Values
No state!
Computation is not a sequence of statementsthat modify state (variables, DB, console), but a
sequence of expressions that result fromsuccessive evaluation of sub-expressions.
32/110
![Page 39: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/39.jpg)
Expressions and Values
No state!Computation is not a sequence of statementsthat modify state (variables, DB, console), but a
sequence of expressions that result fromsuccessive evaluation of sub-expressions.
32/110
![Page 40: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/40.jpg)
Expressions and Values
For example:
(2 * 3) + (4 * 5);
33/110
![Page 41: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/41.jpg)
Expressions and Values
For example:
6 + (4 * 5);
34/110
![Page 42: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/42.jpg)
Expressions and Values
For example:
6 + 20;
35/110
![Page 43: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/43.jpg)
Expressions and Values
For example:
26;
36/110
![Page 44: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/44.jpg)
Expressions and Values
Similarly, when we evaluate function calls.Given the following functions:
function f(x) { return x * x; }function g(y) { return y + y; }
37/110
![Page 45: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/45.jpg)
Expressions and Values
f(2) + g(3);
38/110
![Page 46: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/46.jpg)
Expressions and Values
(2 * 2) + g(3);
39/110
![Page 47: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/47.jpg)
Expressions and Values
4 + g(3);
40/110
![Page 48: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/48.jpg)
Expressions and Values
4 + (3 + 3);
41/110
![Page 49: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/49.jpg)
Expressions and Values
4 + 6;
42/110
![Page 50: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/50.jpg)
Expressions and Values
10;
43/110
![Page 51: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/51.jpg)
No Side Effects
Computation in functional programming has noside-effects. In the examples above, we did notask the program to “print” a result - instead weevaluated an expression (which is the program)and the interpreter returned the value of theexpression (which conveniently got printed at
the end of the evaluation).
44/110
![Page 52: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/52.jpg)
No Side Effects
The only result of a functional computation isthe computed value, and there are no
additional changes that can take place duringcomputation. Functional programming does notsupport variable assignment or state mutation.
45/110
![Page 53: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/53.jpg)
No Side Effects
When external side-effects are required(sending data to an output device, to disk, tothe network), FP tends to delay the side-effect
and push it outside of the computation.
46/110
![Page 54: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/54.jpg)
No Side Effects
Imperative Programming uses statementswhich modify the state of the system, while
Functional Programming evaluates expressionsto return values.
47/110
![Page 55: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/55.jpg)
Higher Order Functions
FP requires that functions be first-class, whichmeans that they are treated like any other
values:
• Functions can be passed as arguments toother functions
• Functions can be returned as a result of afunction
• Functions can be anonymous
48/110
![Page 56: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/56.jpg)
Higher Order Functions
For example:
import { map } from "ramda";
function square(x) { return x * x; }
let a = [1, 2, 3];let b = map(square, a);console.log(b);// ==> [1, 4, 9]
49/110
![Page 57: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/57.jpg)
Higher Order Functions
The function map receives a function as aparameter and an array, and applies the
function to each element in the array, returninga new array.
Sometimes, the functions passed in asarguments are very simple, and thus don’t need
a name, so we can do:
map(x => x * x * x, a);
50/110
![Page 58: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/58.jpg)
Higher Order Functions
An unnamed function is called a
lambda expression.
51/110
![Page 59: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/59.jpg)
Chapter 1: Practical FunctionalProgramming
Advantages of FP
![Page 60: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/60.jpg)
Verification
The way the program is executed is closelyrelated to the way we prove and justify the
correctness of a program mathematically. Proofby mathematical induction is closely related to
the programming technique of recursion.Because functions have no side-effects, they
behave like mathematical functions - each timethey are called with the same parameters, they
return the same values (this is calleddeterminism).
52/110
![Page 61: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/61.jpg)
Parallelism
Since expressions have no side-effects, it isnatural to use parallel evaluation: the values of
independent sub-expressions may bedetermined simultaneously, without fear ofinterference or conflict, and the final result isnot affected by evaluation order. This enables
programs to exploit available parallelismwithout fear of disrupting their correctness.
53/110
![Page 62: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/62.jpg)
Abstraction
FP stresses data-centric computation, withoperations that act on compound datastructures as a whole, rather than via
item-by-item processing. More generally, FPemphasizes the isolation of abstract types thatclearly separate implementation from interface.
Types are used to express and enforceabstraction boundaries, greatly enhancingmaintainability of programs, and facilitating
team development.54/110
![Page 63: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/63.jpg)
Chapter 1: Practical FunctionalProgramming
Using JavaScript to Illustate FP
![Page 64: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/64.jpg)
From Imperative to Procedural
To illustrate the differences amongprogramming paradigms, we will demonstratemultiple iterations over a program that fulfills asimple requirement: We are asked to write aprogram to display a number value squared.
55/110
![Page 65: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/65.jpg)
From Imperative to Procedural
We will then study how the program must beadapted when we introduce slight
modifications of the requirement. All theexamples are given in TypeScript.
56/110
![Page 66: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/66.jpg)
From Imperative to Procedural
We first write a single command that performsas requested:
console.log(0 * 0);
57/110
![Page 67: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/67.jpg)
From Imperative to Procedural
The basic programming tool we used is acommand, also called a statement.
58/110
![Page 68: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/68.jpg)
From Imperative to Procedural
Oh, no! The requirement has changed, and weare now requested to print the squares of the
numbers 0 to 4.
console.log(0 * 0);console.log(1 * 1);console.log(2 * 2);console.log(3 * 3);console.log(4 * 4);
59/110
![Page 69: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/69.jpg)
Structured Programming
This is no good!
• Code repetition• Cannot be easily adapted to new values ofthe parameters
• The nature of the task is not reflected in thestructure of the code
What can we do?
60/110
![Page 70: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/70.jpg)
Structured Programming
• Use variables to capture the parameters, sothat the same program can be applied todifferent values.
• Use an array to separate the data from thetask.
• Use a loop control flow structure to expressthe fact that the same task is repeatedmultiple times on different values.
61/110
![Page 71: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/71.jpg)
Structured Programming
let numbers = [0, 1, 2, 3, 4];for (let i = 0; i < numbers.length; i++) {console.log(numbers[i] * numbers[i]);
}
62/110
![Page 72: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/72.jpg)
Structured Programming
The key programming construct that we haveintroduced in the programming language is the
for-loop. We also introduced variables(numbers and i).
What if we want to print the squares of thenumbers 8 to 12? We have to copy the program
and change the numbers array.
63/110
![Page 73: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/73.jpg)
Procedural Programming
Well, we still need to copy our program forevery new set of parameters.
Also, the coupling between the code and theparameters is accidental, meaning that we
don’t know whether numbers and i apply onlyto our code snippet, or to other snippets of
code as well.
64/110
![Page 74: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/74.jpg)
Procedural Programming
Procedural programming improves on theseweaknesses by introducing:
• Procedures: commands with a well definedinterface of input parameters / outputparameters and expected behavior.
• Local variables: variables which are definedonly within the scope of the procedure.
65/110
![Page 75: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/75.jpg)
Procedural Programming
function printSquares(numbers) {for (let i = 0; i < numbers.length; i++) {console.log(numbers[i] * numbers[i]);
}}
66/110
![Page 76: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/76.jpg)
Procedural Programming
The programming constructs we introduced arefunctions and let which defines local variables
for a block of statements.
67/110
![Page 77: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/77.jpg)
Procedural Programming
Procedures (functions) have an interface:
• Name• Input parameters• Return value
The name of a procedure forms an abstraction.It hides away implementation details from the
client of the procedure.
68/110
![Page 78: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/78.jpg)
Procedural Programming
Consider the following change in requirements:we now want to print the cube of the numbers
rather than their square.
69/110
![Page 79: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/79.jpg)
Procedural Programming
function cube(x) {return Math.pow(x, 3);
}
function printCubes(numbers) {for (let i = 0; i < numbers.length; i++) {console.log(cube(numbers[i]));
}}
70/110
![Page 80: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/80.jpg)
Procedural Programming
We see a first case of procedural abstraction inthis example: the procedure printCubes
iterates over an array, and applies the functioncube on each element. The client of theprintCubes procedure does not directly
invoke the cube function - it is encapsulatedinside the printCubes procedure.
71/110
![Page 81: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/81.jpg)
Testing Requirements
We want to provide the capability to verify thata procedure is correct according to its
specification.
Problem: The function printCubes above isdifficult to test because it only prints to the
console, not returning any output.
Solution: Refactor!
72/110
![Page 82: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/82.jpg)
Testing Requirements
We want to provide the capability to verify thata procedure is correct according to its
specification.
Problem: The function printCubes above isdifficult to test because it only prints to the
console, not returning any output.
Solution: Refactor!
72/110
![Page 83: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/83.jpg)
Testing Requirements
We want to provide the capability to verify thata procedure is correct according to its
specification.
Problem: The function printCubes above isdifficult to test because it only prints to the
console, not returning any output.
Solution: Refactor!
72/110
![Page 84: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/84.jpg)
Testing Requirements
function cubes(numbers) {for (let i = 0; i < numbers.length; i++) {
numbers[i] = cube(numbers[i]);}
}
function printArray(a) {for (let i = 0; i < a.length; i++) {
console.log(a[i]);}
}
function printCubes2(numbers) {cubes(numbers);printArray(numbers);
}
73/110
![Page 85: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/85.jpg)
Testing Requirements
Now, let us write a unit test using the Mochaand Chai libraries:
74/110
![Page 86: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/86.jpg)
Testing Requirements
import { expect } from "chai";import { cubes } from "./lecture1";
describe("cubes", () => {it("cubes the elements of an array", () => {
let numbers = [1, 2, 3];cubes(numbers);expect(numbers).to.deep.equal([1, 8, 27]);
});});
75/110
![Page 87: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/87.jpg)
Testing Requirements
76/110
![Page 88: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/88.jpg)
Problems with the Procedural Paradigm
At this point, we have a nice version of ourprogram:
• It is organized in layers of abstraction• The procedures that operate over arrays usea structured for-loop
• It is testable
77/110
![Page 89: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/89.jpg)
Problems with the Procedural Paradigm
These good features were encouraged byfacilities of the programming language we use:
• It is easy to define arrays, give them names,initialize them with values, pass them asparameters, access their elements.
• It is easy to define functions.
78/110
![Page 90: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/90.jpg)
Problems with the Procedural Paradigm
• Functions can invoke other functions whenknowing their name and the parametersthey expect.
• It is easy to test functions using facilitieslike Mocha and Chai.
79/110
![Page 91: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/91.jpg)
Problems with the Procedural Paradigm
In other words, the language encouraged us toorganize our program in a good manner.
80/110
![Page 92: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/92.jpg)
Problems with the Procedural Paradigm
The procedural paradigm does have itsdrawbacks:
• Procedural programming encourages sharedstate with mutation which makesconcurrency difficult.
• Procedural programming commits early to astep by step way to implement operationswhich prevents performance optimizations.
81/110
![Page 93: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/93.jpg)
Problems with the Procedural Paradigm
• Procedural programming makes it difficultto create functional abstractions that arehighly reusable.
• Procedural programming makes it difficultto reason about code because of sharedstate and mutation.
82/110
![Page 94: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/94.jpg)
Concurrency
Assume we run the procedure cubes in twoconcurrent threads on the same array
numbers.function cubes(numbers) {
for (let i = 0; i < numbers.length; i++) {numbers[i] = cube(numbers[i]);
}}
let n89 = [8, 9];
// In Thread 1:cubes(n89);// In Thread 2:cubes(n89); 83/110
![Page 95: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/95.jpg)
Concurrency
If the 2 threads are interleaved in anunfortunate sequence of events - the following
scenario can occur:Thread 1 Thread 2
numbers[0] = 512numbers[1] = 729 numbers[0] = 512
numbers[1] = 3,841,786,989
84/110
![Page 96: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/96.jpg)
Concurrency
So how can we handle this problem?
• Option 1: enforce mutual exclusion usinglocks
• Option 2: immutable data structures
85/110
![Page 97: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/97.jpg)
Declarative vs. Procedural
Consider the loop control structure as wedefined it. It involves a counter variable i thatis defined for the scope of the loop, initializedto 0, and mutated from 0 to the length of thearray over which we iterate (with the i++
operator). This is one way to iterate over theelements of an array - which is described stepby step in a procedural way, as a precise recipe.
86/110
![Page 98: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/98.jpg)
Declarative vs. Procedural
In contrast, in FP, one would prefer to use amore abstract operation, called map, whichconsists of applying a function over all the
elements of a container, and returning a newcontainer that contains the results.
function cubes(numbers) {return numbers.map(cube);
}
87/110
![Page 99: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/99.jpg)
Declarative vs. Procedural
This version of the function does not change itsparameter - instead, it returns a new arraywhich contains the result. The result has thesame length as the parameter. Note also thatthe operation map does not require a counterlike i to iterate over the array. There is no
mutation.
88/110
![Page 100: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/100.jpg)
Declarative vs. Procedural
An alternative way to express the same FP toolis to use the map function instead of the arraymap method. This is illustrated in this example,using the Ramda package which provides a
large set of FP facilities for JavaScript:
import { map } from "ramda";
function cubes(numbers) {return map(cube, numbers);
}89/110
![Page 101: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/101.jpg)
Functional Abstractions
Let’s remember our procedural solution to ourcubing requirement:
function cubes(numbers) {for (let i = 0; i < numbers.length; i++) {numbers[i] = cube(numbers[i]);
}}
function printArray(a) {for (let i = 0; i < a.length; i++) {console.log(a[i]);
}}
function printCubes2(numbers) {cubes(numbers);printArray(numbers);
} 90/110
![Page 102: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/102.jpg)
Functional Abstractions
Surprise, surprise, new requirements! Computethe exponential value of all elements in a list of
numbers (instead of their cube).
If we could only pass a function as aparameter...
91/110
![Page 103: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/103.jpg)
Functional Abstractions
map to the rescue!
function exponents(numbers) {return numbers.map(Math.exp);
}
92/110
![Page 104: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/104.jpg)
Functional Abstractions
Side-note on syntax: if we want to use ananonymous function, we can use “fat arrow
notation”:function squares(numbers) {return numbers.map(x => x * x);
}
or the function syntax (but then we need to usethe return keyword):
function squares(numbers) {return numbers.map(function (x) { return x * x; });
}
93/110
![Page 105: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/105.jpg)
Functional Abstractions
Consider the following requirement: we want toapply a function to a list of numbers, and then
keep only the values that are even.
94/110
![Page 106: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/106.jpg)
Functional Abstractions
Our solution might look like this:function isEven(x) {return x % 2 === 0;
}
function mapAndKeepEven(f, a) {let fa = a.map(f);let res = [];for (let i = 0; i < fa.length; i++) {
if (isEven(fa[i])) {res.push(fa[i]);
}}return res;
}
95/110
![Page 107: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/107.jpg)
Functional Abstractions
It can’t be! Mutation? Looping? Not in FP!
Introducing filter: given a predicate and alist, return a new list with all elements that
satisfy the predicate. Example:
[1, 2, 3, 4, 5, 6].filter(isEven)// ==> [2, 4, 6]
96/110
![Page 108: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/108.jpg)
Functional Abstractions
So back to mapAndKeepEven, we can rewrite itas
function mapAndKeepEven(f, a) {return a.map(f).filter(isEven);
}
97/110
![Page 109: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/109.jpg)
Functional Abstractions
But why stop here? We can abstract isEvenout, and take the predicate as a parameter,
giving us mapAndFilter:
function mapAndFilter(f, pred, a) {return a.map(f).filter(pred);
}
98/110
![Page 110: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/110.jpg)
Functional Abstractions
Using Ramda, we will compose the functions,instead of method chain them:
import { map, filter } from "ramda";
function mapAndFilter(f, pred, a) {return filter(pred, map(f, a));
}This leads us to another important pattern in
FP: composition.99/110
![Page 111: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/111.jpg)
Functional Abstractions
Ramda offers a function called compose, whichtakes functions f1, . . . , fn and returns a new
function, which is their compositionf1 ◦ f2 ◦ . . . ◦ fn. For example:
import { map, filter, compose } from "ramda";
compose(filter(isEven), map(cube))([0, 1, 2, 3, 4]);// ==> [0, 8, 64]
100/110
![Page 112: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/112.jpg)
Functional Abstractions
So what have we seen so far?
• Functions can receive functions asparameters - including anonymousfunctions (lambda). For example, map,filter and compose receive functions asparameters.
101/110
![Page 113: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/113.jpg)
Functional Abstractions
So what have we seen so far?
• Functions can return functions as acomputed value. For example, composereturns a new function as a computed value.
102/110
![Page 114: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/114.jpg)
Functional Abstractions
So what have we seen so far?
• Ramda functions that receive twoarguments, such as map and filterbehave interestingly when they are passed asingle argument - this is called currying.This behavior makes it much easier tocompose functions.
103/110
![Page 115: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/115.jpg)
Functional Abstractions
All of these features together encourage a styleof programming in which new functions are
built incrementally from smaller functions. Thismethod is the basis of what we call functionalabstractions - such as the family of operators
map and filter (and more we will get todiscover) or the operator compose.
104/110
![Page 116: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/116.jpg)
Reasoning About Code
Suppose we implemented evenCubes asconst evenCubes = compose(filter(isEven), map(cube));
And along comes a friendly consultant thatsuggests we can optimize this function by first
filtering, then cubing:const evenCubes = compose(map(cube), filter(isEven));
Are these two functions equivalent?
105/110
![Page 117: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/117.jpg)
Reasoning About Code
Definition - Function EquivalenceTwo functions f,g are equivalent (which we will write f ≡ g) ifDomainf = Domaing, Rangef = Rangeg and∀x ∈ Domainf, f(x) = g(x).
106/110
![Page 118: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/118.jpg)
Reasoning About Code
This definition holds for the mathematicalsense, but computation can throw an exception,or not terminate. Let’s modify our definition to
support that:
107/110
![Page 119: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/119.jpg)
Reasoning About Code
Definition - Function EquivalenceTwo functions f,g are equivalent (which we will write f ≡ g) ifDomainf = Domaing, Rangef = Rangeg and ∀x ∈ Domainf,either:
• f(x) = g(x)• If f throws an exception, so does g• If f does not terminate, so does g
108/110
![Page 120: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/120.jpg)
Reasoning About Code
Definition - Referential TransparencyThe value of an expression depends only on itssub-expressions, and if you substitute a sub-expression in anexpression by another expression that is equivalent, then theresulting expression is equivalent to the original.
109/110
![Page 121: Principles of Programming Languages - Introduction & …ppl202/wiki.files/class/...Imperative Controlflowisanexplicitsequenceof commands. 10 INPUT "What is your name: "; U$ 20 PRINT](https://reader034.fdocuments.net/reader034/viewer/2022051606/6027f4260ebb7351336aefb2/html5/thumbnails/121.jpg)
Reasoning About Code
Now, let’s check our consultant’s suggestion.Let f = compose(filter(isEven),map(cube)) and
g = compose(map(cube), filter(isEven)).
110/110