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
Rustから学ぶ 非同期処理の仕組み
skanehira
1
150
要件定義・デザインフェーズでもAIを活用して、コミュニケーションの密度を高める
kazukihayase
0
120
ブロックテーマ時代における、テーマの CSS について考える Toro_Unit / 2025.09.13 @ Shinshu WordPress Meetup
torounit
0
130
データ分析エージェント Socrates の育て方
na0
8
3k
「どこから読む?」コードとカルチャーに最速で馴染むための実践ガイド
zozotech
PRO
0
570
AWSで始める実践Dagster入門
kitagawaz
1
750
これでもう迷わない!Jetpack Composeの書き方実践ガイド
zozotech
PRO
0
1.1k
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
440
職種の壁を溶かして開発サイクルを高速に回す~情報透明性と職種越境から考えるAIフレンドリーな職種間連携~
daitasu
0
200
複数サービスを支えるマルチテナント型Batch MLプラットフォーム
lycorptech_jp
PRO
1
990
メルカリIBISの紹介
0gm
0
710
Generative AI Japan 第一回生成AI実践研究会「AI駆動開発の現在地──ブレイクスルーの鍵を握るのはデータ領域」
shisyu_gaku
0
340
Featured
See All Featured
Building an army of robots
kneath
306
46k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Thoughts on Productivity
jonyablonski
70
4.8k
For a Future-Friendly Web
brad_frost
180
9.9k
The Language of Interfaces
destraynor
161
25k
A designer walks into a library…
pauljervisheath
207
24k
Designing Experiences People Love
moore
142
24k
A better future with KSS
kneath
239
17k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Building Adaptive Systems
keathley
43
2.7k
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