SlideShare una empresa de Scribd logo
1 de 77
Descargar para leer sin conexión
The Shape
of
Functional
Programming
Saturday, October 5, 13
@fogus
http://www.fogus.me
http://github.com/documentcloud/underscore-contrib
Saturday, October 5, 13
@fogus
“Functional
JavaScript”Lemonad
codd.js
Saturday, October 5, 13
A
program
written in an
object-oriented
style
Saturday, October 5, 13
Functional
programming
for the MEOW!
Saturday, October 5, 13
Saturday, October 5, 13
Pattern 1 - Map(ish)
var array = [0,1,2,3,4,5];
var transformed = [];
 
for (var i = 0; i < array.length; i++) {
transformed.push(array[i] + 100);
}
 
transformed;
//=> [100, 101, 102, 103, 104, 105]
Saturday, October 5, 13
Pattern 1 - Map(ish)
// Underscore
 
_.map(array, function(n) {
return n + 100;
});
 
 
// Lemonad
 
L.map(L.add(100), array);
Saturday, October 5, 13
Pattern 2 - Filter(ish)
var array = [0,1,2,3,4,5];
var keepers = [];
 
for (var i = 0; i < array.length; i++) {
if (array[i] % 2 === 0) {
keepers.push(array[i]);
}
}
 
keepers;
//=> [101, 102, 103, 104, 105]
Saturday, October 5, 13
Pattern 2 - Filter(ish)
// Underscore
 
_.filter(array, function(n) {
if (n % 2 === 0) {
return true;
}
else {
return false;
}
});
 
// Lemonad
 
L.filter(L.isEven, array);
Saturday, October 5, 13
Pattern 3 - Reduce(ish)
var array = [0,1,2,3,4,5];
var sum = 0;
 
for (var i = 0; i < array.length; i++) {
sum += array[i];
}
 
sum;
//=> 15
Saturday, October 5, 13
Pattern 3 - Reduce(ish)
// Underscore
 
_.reduce(array, function(acc, n) {
return acc + n;
}, 0);
 
 
// Lemonad
 
L.reduce(L.uncurry(L.add), 0, array);
Saturday, October 5, 13
APL
life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}
0 1 0 0 1 0 0 1 0
0 1 0
0 1 0
0 1 0
Saturday, October 5, 13
Fun.js at a glance
• Simple data
• Many small functions
• Larger abstractions built via composition
• OO to supplement (no dogma)
Saturday, October 5, 13
Simple data
Saturday, October 5, 13
“
Saturday, October 5, 13
#
Saturday, October 5, 13
42
Saturday, October 5, 13
?
Saturday, October 5, 13
Saturday, October 5, 13
[ ]
Saturday, October 5, 13
#
Saturday, October 5, 13
#
[1, 2, 3, 4, 5]
Saturday, October 5, 13
Saturday, October 5, 13
{ }
Saturday, October 5, 13
#“
Saturday, October 5, 13
#“
{x: 0, y: 1}
Saturday, October 5, 13
{x: 0, y: 1}
#
Saturday, October 5, 13
Saturday, October 5, 13
*
Saturday, October 5, 13
Small functions
Saturday, October 5, 13
Saturday, October 5, 13
λ
Saturday, October 5, 13
λ
Saturday, October 5, 13
λ
Saturday, October 5, 13
Disclaimer
Saturday, October 5, 13
#
Procedure
Saturday, October 5, 13
#
Procedure
Saturday, October 5, 13
function logNth(array, index) {
console.log(array[index]);
}
logNth([‘a’, ‘b’, ‘c’], 1);
// (console) b
#
Saturday, October 5, 13
Purity
Saturday, October 5, 13
Ostrich Purity
Saturday, October 5, 13
Ostrich Purity
Saturday, October 5, 13
#
Function
Kinda important
Saturday, October 5, 13
function nth(array, index) {
return array[index];
}
nth([‘a’, ‘b’, ‘c’], 1);
//=> ‘b’
#
Saturday, October 5, 13
Saturday, October 5, 13
Saturday, October 5, 13
Saturday, October 5, 13
id name age
555-55-5555 Moe 45
777-77-7777 Curly 47
0
1
Saturday, October 5, 13
var table = [
{id: ‘555-55-5555’,
name: ‘Moe’,
age: 45},
{id: ‘777-77-7777’,
name: ‘Curly’,
age: 47}
];
Saturday, October 5, 13
id name age
555-55-5555 Moe 45
777-77-7777 Curly 47
0
1
Saturday, October 5, 13
#“
Saturday, October 5, 13
function cell(table, col, row){
return table[row][col];
}
cell(table, ‘name’, 0);
//=> ‘Moe’
cell(table, ‘age’, 0);
//=> 45
#“
Saturday, October 5, 13
Larger abstractions
built via composition
Saturday, October 5, 13
L
Clojure, Haskell, ML, Joy, _
Saturday, October 5, 13
Currying, partial
application, fixation, oh
my!
Saturday, October 5, 13
#“
Saturday, October 5, 13
#“
L.fix
Saturday, October 5, 13
#
L.fix(cell, L._, ‘name’, L._);
‘name’
Saturday, October 5, 13
#
L.fix(cell, L._, ‘name’, L._);
var getName = L.fix(cell, L._, ‘name’, L._);
getName(table, 0);
//=> ‘Moe’
getName(table, 1);
//=> ‘Curly’
‘name’
Saturday, October 5, 13
#“
L.rot
Saturday, October 5, 13
#
L.rot(cell);
“
Saturday, October 5, 13
#“
L.partial
Saturday, October 5, 13
L.partial(L.rot(cell), ‘name’);
#‘name’
Saturday, October 5, 13
L.partial(L.rot(cell), ‘name’);
var getName = L.partial(L.rot(cell), ‘name’);
getName(0, table);
//=> ‘Moe’
getName(1, table);
//=> ‘Curly’
#‘name’
Saturday, October 5, 13
L.rcurry
“
Codd.col(table, ‘name’);
//=> [‘Moe’, ‘Curly’]
Saturday, October 5, 13
“
“
L.rcurry2(Codd.col);
Saturday, October 5, 13
“
L.rcurry2(Codd.col);
var valuesFor = L.rcurry2(Codd.col);
var allNames = valuesFor(‘name’);
allNames(table);
//=> [‘Moe’, ‘Curly’]
Saturday, October 5, 13
Compositions and
Pipelines
Saturday, October 5, 13
How to count
all of the values
in a column?
Saturday, October 5, 13
“
function countValues(table, tag) {
return L.len(Codd.col(table, tag));
}
countValues(table, ‘name’);
//=> 2
#
Saturday, October 5, 13
L.comp
return L.len(Codd.col(table, tag));
First thisThen this
Saturday, October 5, 13
“Codd.col
#
L.len
Saturday, October 5, 13
“Codd.col
#
L.len
Saturday, October 5, 13
“
var countValues = L.comp(L.len, Codd.col);
countValues(table, ‘name’);
//=> 2
#
Saturday, October 5, 13
L.pipeline
L.pipeline(table, Codd.col(‘name’), L.len);
//=> 2
First this Then this
Saturday, October 5, 13
codd.js (demo)
Relational Algebra
Saturday, October 5, 13
Thanks
• The NationJS team
• O’Reilly
• Alan Dipert
• Paul Khuong
• The Underscore community
• The Clojure community
Saturday, October 5, 13

Más contenido relacionado

Similar a The Shape of Functional Programming

Distributed Data Structures
Distributed Data StructuresDistributed Data Structures
Distributed Data Structures
PDX Web & Design
 
Seattle.rb 6.4
Seattle.rb 6.4Seattle.rb 6.4
Seattle.rb 6.4
deanhudson
 
Scala: Simplifying Development
Scala: Simplifying DevelopmentScala: Simplifying Development
Scala: Simplifying Development
mircodotta
 
Test driven game development silly, stupid or inspired?
Test driven game development   silly, stupid or inspired?Test driven game development   silly, stupid or inspired?
Test driven game development silly, stupid or inspired?
Eric Smith
 

Similar a The Shape of Functional Programming (18)

Clojure night
Clojure nightClojure night
Clojure night
 
Mastering ElasticSearch with Ruby and Tire
Mastering ElasticSearch with Ruby and TireMastering ElasticSearch with Ruby and Tire
Mastering ElasticSearch with Ruby and Tire
 
Ruby 2.0 / Rails 4.0, A selection of new features.
Ruby 2.0 / Rails 4.0, A selection of new features.Ruby 2.0 / Rails 4.0, A selection of new features.
Ruby 2.0 / Rails 4.0, A selection of new features.
 
JavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java DevelopersJavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java Developers
 
The Not Java That's Not Scala
The Not Java That's Not ScalaThe Not Java That's Not Scala
The Not Java That's Not Scala
 
JavaScript 1.8.5: New Features Explored
JavaScript 1.8.5:  New Features ExploredJavaScript 1.8.5:  New Features Explored
JavaScript 1.8.5: New Features Explored
 
Distributed Data Structures
Distributed Data StructuresDistributed Data Structures
Distributed Data Structures
 
D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + Rails
 
Intro to pattern matching in scala
Intro to pattern matching in scalaIntro to pattern matching in scala
Intro to pattern matching in scala
 
Web directions code 13 notes
Web directions code 13 notesWeb directions code 13 notes
Web directions code 13 notes
 
Programação Funcional
Programação FuncionalProgramação Funcional
Programação Funcional
 
Seattle.rb 6.4
Seattle.rb 6.4Seattle.rb 6.4
Seattle.rb 6.4
 
Property based Testing - generative data & executable domain rules
Property based Testing - generative data & executable domain rulesProperty based Testing - generative data & executable domain rules
Property based Testing - generative data & executable domain rules
 
Meet Couch DB
Meet Couch DBMeet Couch DB
Meet Couch DB
 
Scala: Simplifying Development
Scala: Simplifying DevelopmentScala: Simplifying Development
Scala: Simplifying Development
 
OWASP Top 10 2013
OWASP Top 10 2013OWASP Top 10 2013
OWASP Top 10 2013
 
Test driven game development silly, stupid or inspired?
Test driven game development   silly, stupid or inspired?Test driven game development   silly, stupid or inspired?
Test driven game development silly, stupid or inspired?
 

Más de Mike Fogus (6)

Confo
ConfoConfo
Confo
 
The Return of the Living Datalog
The Return of the Living DatalogThe Return of the Living Datalog
The Return of the Living Datalog
 
Naïveté vs. Experience
Naïveté vs. ExperienceNaïveté vs. Experience
Naïveté vs. Experience
 
The Magnificent Seven
The Magnificent SevenThe Magnificent Seven
The Magnificent Seven
 
Clojure 1.1 And Beyond
Clojure 1.1 And BeyondClojure 1.1 And Beyond
Clojure 1.1 And Beyond
 
Why Scala?
Why Scala?Why Scala?
Why Scala?
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 

The Shape of Functional Programming

Notas del editor

  1. just kidding
  2. 1979
  3. boolean
  4. data abstractions, composed from primitive types
  5. data abstractions, composed from primitive types
  6. show cell(table, r, c)