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
610
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
20250912_RPALT_データを集める→とっ散らかる問題_Obsidian紹介
ratsbane666
0
100
「どこから読む?」コードとカルチャーに最速で馴染むための実践ガイド
zozotech
PRO
0
540
開発者を支える Internal Developer Portal のイマとコレカラ / To-day and To-morrow of Internal Developer Portals: Supporting Developers
aoto
PRO
1
470
テストを軸にした生き残り術
kworkdev
PRO
0
210
Platform開発が先行する Platform Engineeringの違和感
kintotechdev
4
580
現場で効くClaude Code ─ 最新動向と企業導入
takaakikakei
1
260
Claude Code でアプリ開発をオートパイロットにするためのTips集 Zennの場合 / Claude Code Tips in Zenn
wadayusuke
0
110
Automating Web Accessibility Testing with AI Agents
maminami373
0
1.3k
S3アクセス制御の設計ポイント
tommy0124
3
200
下手な強制、ダメ!絶対! 「ガードレール」を「檻」にさせない"ガバナンス"の取り方とは?
tsukaman
2
450
Evolución del razonamiento matemático de GPT-4.1 a GPT-5 - Data Aventura Summit 2025 & VSCode DevDays
lauchacarro
0
210
複数サービスを支えるマルチテナント型Batch MLプラットフォーム
lycorptech_jp
PRO
1
820
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
530
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Unsuck your backbone
ammeep
671
58k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Building Adaptive Systems
keathley
43
2.7k
How STYLIGHT went responsive
nonsquared
100
5.8k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
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