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
Building Functional Islands
Search
Mark Jones
April 28, 2016
Technology
2
540
Building Functional Islands
A talk about functional programming at the April 2016 Front End London
http://frontendlondon.co.uk
Mark Jones
April 28, 2016
Tweet
Share
Other Decks in Technology
See All in Technology
『GRANBLUE FANTASY: Relink』最高の「没入感」を実現するカットシーン制作手法とそれを支える技術
cygames
1
160
PDF Viewer作成の今までとこれから
hunachi
0
480
学術機関におけるID連携とOpenID Connect
fujie
0
320
QAに対する超個人的な解釈 / Personal Take on QA
toma_sm
1
150
公共交通データとアプリ制作 - Mini Tokyo 3D の初期制作過程を振り返る
nagix
1
110
Developer Experienceを向上させる基盤づくりの取り組み事例集
coconala_engineer
0
160
フルカイテン株式会社 採用資料
fullkaiten
0
32k
プログラム検証入門
riru
6
880
「自動テストのプラクティスを効果的に学ぶためのカードゲーム」 ( #sqip2024 )
teyamagu
PRO
2
190
OSTという文化を組織に根付かせてみた
sansantech
PRO
2
430
Tricentisにおけるテスト自動化へのAI活用ご紹介/20240910Shunsuke Katakura
shift_evolve
0
210
Fediverse Discovery Providers overview
andypiper
0
170
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.1k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
Visualization
eitanlees
142
15k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
26
3.9k
Why Our Code Smells
bkeepers
PRO
334
56k
Bash Introduction
62gerente
608
210k
GitHub's CSS Performance
jonrohan
1030
450k
How STYLIGHT went responsive
nonsquared
93
5.1k
YesSQL, Process and Tooling at Scale
rocio
167
14k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
38
9.2k
How to Ace a Technical Interview
jacobian
274
23k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.6k
Transcript
Building Functional Islands
Audience Participation
What is Functional Programming?
Statements const nums = [1, 2, 3]; const doubled =
[]; for (let i = 0; i < nums.length; i++) { doubled.push(nums[i] * 2); }
Statements const nums = [1, 2, 3]; const doubled =
[]; for (let i = 0; i < nums.length; i++) { doubled.push(nums[i] * 2); }
Statements const nums = [1, 2, 3]; const doubled =
[]; for (let i = 0; i < nums.length; i++) { doubled.push(nums[i] * 2); }
Statements const nums = [1, 2, 3]; const doubled =
[]; for (let i = 0; i < nums.length; i++) { doubled.push(nums[i] * 2); }
function double(x) { return x * 2; } map([1, 2,
3], double); Expressions
function double(x) { return x * 2; } map([1, 2,
3], double); // [(1 * 2), (2 * 2), (3 * 2)] Expressions
function double(x) { return x * 2; } map([1, 2,
3], double); // [(1 * 2), (2 * 2), (3 * 2)] // [2, 4, 6] Expressions
Why Functional Programming?
Functions Island Building Block #1
First-Class Functions function onClick() { // I'm a first-class function
} document.body.addEventListener('click', onClick);
function onClick() { // I get called by a higher-order
function } document.body.addEventListener('click', onClick); Higher-Order Functions
Higher-Order Functions function logify(fn) { return (...args) => { console.log(args);
return fn(...args); }; } const logifyAdd = logify(add); function add(x, y) { return x + y; }
Higher-Order Functions function logify(fn) { return (...args) => { console.log(args);
return fn(...args); }; } const logifyAdd = logify(add); function add(x, y) { return x + y; }
Higher-Order Functions function logify(fn) { return (...args) => { console.log(args);
return fn(...args); }; } const logifyAdd = logify(add); function add(x, y) { return x + y; }
Higher-Order Functions const logifyAdd = logify(add); logifyAdd(1, 2); // [1,
2] // 3
Higher-Order Functions The Benefits
Pure Functions function add(x, y) { // I'm a pure
function return x + y; }
Pure Functions add(1, 2) + add(3, 4);
Pure Functions add(1, 2) + add(3, 4); // 3 +
add(3, 4);
Pure Functions add(1, 2) + add(3, 4); // 3 +
add(3, 4); // 3 + 7;
Pure Functions add(1, 2) + add(3, 4); // 3 +
add(3, 4); // 3 + 7; // 10;
function addAndSomethingElse(x, y) { // I'm an impure function doSomethingElse();
return x + y; } Pure Functions
Pure Functions addAndSomethingElse(1, 2) // ???
Pure Functions The Benefits
Pure Functions The Reality
Immutability Island Building Block #2
Immutable values const nums = [1, 2, 3]; const person
= { name: 'mark', age: 29 }; nums[0] = 2; // [2, 2, 3] person.age = 27; // { name: 'mark', age: 27 }
Immutable values const nums = [1, 2, 3]; const person
= { name: 'mark', age: 29 }; nums[0] = 2; // [2, 2, 3] person.age = 27; // { name: 'mark', age: 27 }
Immutable values const nums = [1, 2, 3]; const person
= { name: 'mark', age: 29 }; nums[0] = 2; // [2, 2, 3] person.age = 27; // { name: 'mark', age: 27 }
Immutable values const nums = [1, 2, 3]; const person
= { name: 'mark', age: 29 }; nums[0] = 2; // [2, 2, 3] person.age = 27; // { name: 'mark', age: 27 }
Object.freeze const nums = Object.freeze([1, 2, 3]); const person =
Object.freeze({ name: 'mark', age: 29 }); nums[0] = 2; // [1, 2, 3] person.age = 27; // { name: 'mark', age: 29 }
Object.freeze const nums = Object.freeze([1, 2, 3]); const person =
Object.freeze({ name: 'mark', age: 29 }); nums[0] = 2; // [1, 2, 3] person.age = 27; // { name: 'mark', age: 29 }
Object.freeze const nums = Object.freeze([1, 2, 3]); const person =
Object.freeze({ name: 'mark', age: 29 }); nums[0] = 2; // [1, 2, 3] person.age = 27; // { name: 'mark', age: 29 }
Object.freeze const employee = Object.freeze({ department: 'Eng', profile: { name:
'mark', age: 29 } }); employee.profile.age = 27; // {...{ name: 'mark', age: 27 } }
Object.freeze const employee = Object.freeze({ department: 'Eng', profile: { name:
'mark', age: 29 } }); employee.profile.age = 27; // {...{ name: 'mark', age: 27 } }
Object.freeze const employee = Object.freeze({ department: 'Eng', profile: { name:
'mark', age: 29 } }); employee.profile.age = 27; // {...{ name: 'mark', age: 27 } }
deepFreeze const employee = deepFreeze({ department: 'Eng', profile: { name:
'mark', age: 29 } }); employee.profile.age = 27; // {...{ name: 'mark', age: 29 } }
Immutability The Benefits
Immutability The Reality
Currying Island Building Block #3
Currying const add = curry((x, y) => { return x
+ y; }); const succ = add(1); succ(1); // 2
Currying const add = curry((x, y) => { return x
+ y; }); const succ = add(1); succ(1); // 2
Currying const add = curry((x, y) => { return x
+ y; }); const succ = add(1); succ(1); // 2
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const firstNames = map(devs, (dev) => { return dev.firstName; });
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const firstNames = map(devs, (dev) => { return dev.firstName; });
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const firstNames = map(devs, (dev) => { return dev.firstName; });
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const getFirstNames = map(prop('firstName')); const firstNames = getFirstNames(devs);
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const getFirstNames = map(prop('firstName')); const firstNames = getFirstNames(devs);
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const getFirstNames = map(prop('firstName')); const firstNames = getFirstNames(devs);
Currying const devs = [ { firstName: 'mark' }, {
firstName: 'sally' } ]; const getFirstNames = map(prop('firstName')); const firstNames = getFirstNames(devs);
Currying The Benefits
Currying The Reality
Composition Island Building Block #4
Composition const value = 1; const gRes = g(value); const
fgRes = f(gRes);
Composition const value = 1; const gRes = g(value); const
fgRes = f(gRes);
Composition const value = 1; const gRes = g(value); const
fgRes = f(gRes);
Composition const value = 1; const gRes = g(value); const
fgRes = f(gRes);
Composition function fg(x) { return f(g(x)); } fg(1);
Composition const fg = compose(f, g); fg(1);
Composition function getFilmIdsFromResponse(resp) { return getIds(getFilms(JSON.parse(resp))); } getFilmIdsFromResponse('{ "films": [{
id: 1 }, ...], "actors": [...] }');
Composition function getFilmIdsFromResponse(resp) { return getIds(getFilms(JSON.parse(resp))); } getFilmIdsFromResponse('{ "films": [{
id: 1 }, ...], "actors": [...] }');
Composition function getFilmIdsFromResponse(resp) { return getIds(getFilms(JSON.parse(resp))); } getFilmIdsFromResponse('{ "films": [{
id: 1 }, ...], "actors": [...] }');
Composition function getFilmIdsFromResponse(resp) { return getIds(getFilms(JSON.parse(resp))); } getFilmIdsFromResponse('{ "films": [{
id: 1 }, ...], "actors": [...] }');
Composition function getFilmIdsFromResponse(resp) { return getIds(getFilms(JSON.parse(resp))); } getFilmIdsFromResponse('{ "films": [{
id: 1 }, ...], "actors": [...] }');
Composition const getIds = map(prop('id')); const getFilmIdsFromResponse = compose(getIds, prop('films'),
JSON.parse); getFilmIdsFromResponse('{ "films": [...], "actors": [...] }');
Composition const getIds = map(prop('id')); const getFilmIdsFromResponse = compose(getIds, prop('films'),
JSON.parse); getFilmIdsFromResponse('{ "films": [...], "actors": [...] }');
Composition const getIds = map(prop('id')); const getFilmIdsFromResponse = compose(getIds, prop('films'),
JSON.parse); getFilmIdsFromResponse('{ "films": [...], "actors": [...] }');
Composition const getIds = map(prop('id')); const getFilmIdsFromResponse = compose(getIds, prop('films'),
JSON.parse); getFilmIdsFromResponse('{ "films": [...], "actors": [...] }');
Composition const getIds = map(prop('id')); const getFilmIdsFromResponse = compose(getIds, prop('films'),
JSON.parse); getFilmIdsFromResponse('{ "films": [...], "actors": [...] }');
Composition The Benefits
Composition The Reality
I’m confused. What’s a functional island again?
Further reading / watch list (free) https://drboolean.gitbooks.io/mostly-adequate-guide/content/ Professor Frisby's Mostly
Adequate Guide to Functional Programming http://ramdajs.com/ A practical functional library for Javascript programmers https://github.com/lodash/lodash/wiki/FP-Guide lodash/fp guide https://www.youtube.com/watch?v=m3svKOdZijA Hey Underscore, You're Doing It Wrong! https://github.com/substack/deep-freeze deepFreeze
Further reading / watch list (paid) https://frontendmasters.com/courses/functional-js-lite/ Functional Lite JavaScript
https://frontendmasters.com/courses/functional-javascript/ Hardcore Functional Programming in JavaScript
Thank you. @mark_ jones