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
How to stabilize UI tests using XCTest
akkeylab
0
130
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
290
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
860
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
130
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
460
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
260
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
2
390
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
250
Windows on Ryzen and I
seosoft
0
300
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
580
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
610
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
150
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
Side Projects
sachag
455
43k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.4k
Testing 201, or: Great Expectations
jmmastey
46
8.1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
160
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
150
The Cult of Friendly URLs
andyhume
79
6.8k
The Limits of Empathy - UXLibs8
cassininazir
1
260
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
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!