Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
A Humane Introduction to Functional Programming
Search
John S.
May 09, 2014
Programming
0
70
A Humane Introduction to Functional Programming
A gentle look at what functional programming is.
John S.
May 09, 2014
Tweet
Share
More Decks by John S.
See All by John S.
Iteration, iteration, iteration.
sneeu
0
130
Do Something Else
sneeu
0
32
Data at FanDuel
sneeu
1
100
As Little As Possible
sneeu
0
84
Other Decks in Programming
See All in Programming
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
950
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
370
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
180
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
550
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
220
SourceGeneratorのススメ
htkym
0
190
Apache Iceberg V3 and migration to V3
tomtanaka
0
160
CSC307 Lecture 07
javiergs
PRO
0
550
CSC307 Lecture 01
javiergs
PRO
0
690
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
610
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
160
Featured
See All Featured
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
How to Talk to Developers About Accessibility
jct
2
130
Making Projects Easy
brettharned
120
6.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
330
Measuring & Analyzing Core Web Vitals
bluesmoon
9
750
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Being A Developer After 40
akosma
91
590k
We Are The Robots
honzajavorek
0
160
Information Architects: The Missing Link in Design Systems
soysaucechin
0
770
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
210
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Transcript
A Humane Introduction to Functional Programming 9th May, 2014-ScotlandJS #sjsJohn
A Humane Introduction to Functional Programming 9th May, 2014-ScotlandJS #sjsJohn
John Sutherland sneeu.com #sjsJohn
A Humane Introduction to Functional Programming 9th May, 2014-ScotlandJS #sjsJohn
Functional Programming “… treats computation as the evaluation of mathematical
functions and avoids state and mutable data #sjsJohn
Humane “Characterised by tenderness, compassion, and sympathy for people and
animals, especially for the suffering or distressed #sjsJohn
“We’ll need to be strict with the 20 minute duration
#sjsJohn -Peter Aitken
Functional Programming Matters #sjsJohn Why
Functional Programming Offers #sjsJohn What
Warning! Contrived examples ahead #sjsJohn
Higher-Order functions #sjsJohn Functions which take a function as an
argument, return a function, or both.
#sjsJohn var makeAdder = function (x) { return function (n)
{ return x + n; }; }; ! _.map([2, 3, 5], makeAdder(7)); // [9, 10, 12] 1 2 3 4 5 6 7
#sjsJohn var map = function (list, func) { var i,
result = []; ! for (i = 0; i < list.length; i++) { result.push(func(list[i])); } ! return result; }; 1 2 3 4 5 6 7 8 9
Purity #sjsJohn A pure function always evaluates to the same
result given the same arguments.
#sjsJohn var x = 3; ! var impure = function
(y) { return x + y; }; ! expect(impure(4)).toBe(7); 1 2 3 4 5 6 7
Immutability #sjsJohn An immutable object is an object whose value
cannot be changed after it is created.
#sjsJohn var map = function (list, func) { var i,
result = []; ! for (i = 0; i < list.length; i++) { result.push(func(list[i])); } ! return result; }; 1 2 3 4 5 6 7 8 9
#sjsJohn var map = function (list, func) { if (list.length
== 0) { return []; } else { return [func(list[0])].concat( map(list.slice(1), func) ); } }; 1 2 3 4 5 6 7 8 9
“If a pure function mutates some local data in order
to produce an immutable return value, is that ok? #sjsJohn -Rich Hickey
Application #sjsJohn
Project Euler Problem No. 2 #sjsJohn By considering the terms
in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
Fibonacci sequence #sjsJohn Fn = Fn−1 + Fn−2
1, 1, 2, 3, 5, 8, 13 … #sjsJohn
var euler2 = function () { var a = 1,
b = 1, result = 0, next = a + b; ! while (next <= 4000000) { if (next % 2 == 0) result += next; a = b; b = next; next = a + b; } ! return result; }; 1 2 3 4 5 6 7 8 9 10 11 12 13 #sjsJohn
var euler2 = function () { var a = 1,
b = 1, result = 0, next = a + b; ! while (next <= 4000000) { if (next % 2 == 0) result += next; a = b; b = next; next = a + b; } ! return result; }; 1 2 3 4 5 6 7 8 9 10 11 12 13 #sjsJohn
var fib = function (n) { if (n < 2)
return 1; return fib(n - 1) + fib(n - 2); }; 1 2 3 4 #sjsJohn
var fibSequence = function (max) { var i, seq =
[]; ! for (i = 0; fib(i) <= max; i++) { seq.push(fib(i)); } ! return seq; }; 1 2 3 4 5 6 7 8 9 #sjsJohn
var fibSequence = function (pred) { var i, seq =
[]; ! for (i = 0; pred(fib(i), i); i++) { seq.push(fib(i)); } ! return seq; }; 1 2 3 4 5 6 7 8 9 #sjsJohn
var twentyTerms = function (f, i) { return i <
20; }; ! var maxTerm = function (max) { return function (f, i) { return f <= max; }; }; 1 2 3 4 5 6 7 8 9 #sjsJohn
var fibs = fibSequence(maxTerm(4000000)); 1 #sjsJohn
var isEven = function (n) { return n % 2
== 0; }; ! var fibs = _.filter( fibSequence(maxTerm(4000000)), isEven ); 1 2 3 4 5 6 7 8 #sjsJohn
The Sum of a List #sjsJohn … is the first
item plus the sum of the rest.
var add = function (a, b) { return a +
b; }; ! var sum = function (list) { return _.reduce(list, add, 0); }; 1 2 3 4 5 6 7 #sjsJohn
_.reduce([1, 2, 3, 4, 5], add, 0); ! add(0, 1)
// 1 add(1, 2) // 3 add(3, 3) // 6 add(6, 4) // 10 add(10, 5) // 15 #sjsJohn 1 2 3 4 5 6 7
Drum-roll please #sjsJohn
sum( _.filter( fibSequence( maxTerm(4000000) ), function (n) { return n
% 2 == 0; } ) ); 1 2 3 4 5 6 7 8 #sjsJohn
var fib = function (n) { if (n < 2)
return 1; return fib(n - 1) + fib(n - 2); }; 1 2 3 4 #sjsJohn
var fib = _.memoize(function (n) { if (n < 2)
return 1; return fib(n - 1) + fib(n - 2); }); 1 2 3 4 #sjsJohn
var memoize = function (func) { var cache = {};
! return function () { if (!_.has(cache, arguments)) { cache[arguments] = func.apply(this, arguments); } return cache[arguments]; }; }; 1 2 3 4 5 6 7 8 9 10 11 #sjsJohn
Review & an Improvement #sjsJohn
var fibs = function* () { var i = 0;
! while (true) { yield fib(i); i++; } }; 1 2 3 4 5 6 7 8 #sjsJohn
var fibGenerator = fibs(); ! fibGenerator.next(); // 1 fibGenerator.next(); //
1 fibGenerator.next(); // 2 fibGenerator.next(); // 3 fibGenerator.next(); // 5 fibGenerator.next(); // 8 1 2 3 4 5 6 7 8 #sjsJohn
Further … #sjsJohn Adventures in Functional Programming - Jim Weirich
Enemy of the State - Phil Roberts Functional JavaScript - Michael Fogus
None
Thank you!