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
66
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
120
Do Something Else
sneeu
0
28
Data at FanDuel
sneeu
1
94
As Little As Possible
sneeu
0
78
Other Decks in Programming
See All in Programming
AppRouter Panel Talk
yosuke_furukawa
PRO
1
460
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
120
Apache Hive 4 on Treasure Data
ryukobayashi
1
420
Ruby Function Composition
bkuhlmann
1
340
"config" ってなんだ? / What is "config"?
okashoi
0
250
初心者のためのRubyKaigi入門/RubyKaigi Introduction
a_matsuda
8
1.4k
PostmanでAPIの動作確認が楽になった話
h455h1
0
180
見た目から始める生産性向上
ikumatadokoro
10
1.3k
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
480
Fast JSX: Don't clone props object #28768
yossydev
1
160
障害対応を起点としたもっといい開発と運用のサイクル作りのためにできること / Hatena Enginner Seminar #29
polamjag
0
370
デフォルトにして至高、RubyMineの大好きな所
ruzia
0
720
Featured
See All Featured
The Cult of Friendly URLs
andyhume
74
5.7k
Embracing the Ebb and Flow
colly
80
4.2k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
KATA
mclloyd
16
12k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
Robots, Beer and Maslow
schacon
PRO
155
7.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
21
1.4k
We Have a Design System, Now What?
morganepeng
44
6.8k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
20
1.6k
What's new in Ruby 2.0
geeforr
337
31k
Teambox: Starting and Learning
jrom
128
8.4k
Learning to Love Humans: Emotional Interface Design
aarron
267
39k
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!