SlideShare ist ein Scribd-Unternehmen logo
1 von 77
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ähnlich wie 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
 

Ähnlich wie 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?
 

Mehr von 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?
 

Kürzlich hochgeladen

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
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
 

Kürzlich hochgeladen (20)

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
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
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
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
 
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
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
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...
 
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 ...
 

The Shape of Functional Programming

Hinweis der Redaktion

  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)