0
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++) {
transform...
Pattern 1 - Map(ish)
// Underscore
 
_.map(array, function(n) {
return n + 100;
});
 
 
// Lemonad
 
L.map(L.add(100), arr...
Pattern 2 - Filter(ish)
var array = [0,1,2,3,4,5];
var keepers = [];
 
for (var i = 0; i < array.length; i++) {
if (array[...
Pattern 2 - Filter(ish)
// Underscore
 
_.filter(array, function(n) {
if (n % 2 === 0) {
return true;
}
else {
return fals...
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]...
Pattern 3 - Reduce(ish)
// Underscore
 
_.reduce(array, function(acc, n) {
return acc + n;
}, 0);
 
 
// Lemonad
 
L.reduc...
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...
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, Octobe...
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 ...
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);
//=> 4...
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,...
#“
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, tab...
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’...
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, ...
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
Satur...
Upcoming SlideShare
Loading in...5
×

The Shape of Functional Programming

1,975

Published on

The slides created for the NationJS 2013 conference.

Published in: Technology
2 Comments
5 Likes
Statistics
Notes
No Downloads
Views
Total Views
1,975
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
24
Comments
2
Likes
5
Embeds 0
No embeds

No notes for slide
  • just kidding
  • 1979
  • boolean
  • data abstractions, composed from primitive types
  • data abstractions, composed from primitive types
  • show cell(table, r, c)
  • Transcript of "The Shape of Functional Programming"

    1. 1. The Shape of Functional Programming Saturday, October 5, 13
    2. 2. @fogus http://www.fogus.me http://github.com/documentcloud/underscore-contrib Saturday, October 5, 13
    3. 3. @fogus “Functional JavaScript”Lemonad codd.js Saturday, October 5, 13
    4. 4. A program written in an object-oriented style Saturday, October 5, 13
    5. 5. Functional programming for the MEOW! Saturday, October 5, 13
    6. 6. Saturday, October 5, 13
    7. 7. 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
    8. 8. Pattern 1 - Map(ish) // Underscore   _.map(array, function(n) { return n + 100; });     // Lemonad   L.map(L.add(100), array); Saturday, October 5, 13
    9. 9. 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
    10. 10. 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
    11. 11. 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
    12. 12. 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
    13. 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
    14. 14. Fun.js at a glance • Simple data • Many small functions • Larger abstractions built via composition • OO to supplement (no dogma) Saturday, October 5, 13
    15. 15. Simple data Saturday, October 5, 13
    16. 16. “ Saturday, October 5, 13
    17. 17. # Saturday, October 5, 13
    18. 18. 42 Saturday, October 5, 13
    19. 19. ? Saturday, October 5, 13
    20. 20. Saturday, October 5, 13
    21. 21. [ ] Saturday, October 5, 13
    22. 22. # Saturday, October 5, 13
    23. 23. # [1, 2, 3, 4, 5] Saturday, October 5, 13
    24. 24. Saturday, October 5, 13
    25. 25. { } Saturday, October 5, 13
    26. 26. #“ Saturday, October 5, 13
    27. 27. #“ {x: 0, y: 1} Saturday, October 5, 13
    28. 28. {x: 0, y: 1} # Saturday, October 5, 13
    29. 29. Saturday, October 5, 13
    30. 30. * Saturday, October 5, 13
    31. 31. Small functions Saturday, October 5, 13
    32. 32. Saturday, October 5, 13
    33. 33. λ Saturday, October 5, 13
    34. 34. λ Saturday, October 5, 13
    35. 35. λ Saturday, October 5, 13
    36. 36. Disclaimer Saturday, October 5, 13
    37. 37. # Procedure Saturday, October 5, 13
    38. 38. # Procedure Saturday, October 5, 13
    39. 39. function logNth(array, index) { console.log(array[index]); } logNth([‘a’, ‘b’, ‘c’], 1); // (console) b # Saturday, October 5, 13
    40. 40. Purity Saturday, October 5, 13
    41. 41. Ostrich Purity Saturday, October 5, 13
    42. 42. Ostrich Purity Saturday, October 5, 13
    43. 43. # Function Kinda important Saturday, October 5, 13
    44. 44. function nth(array, index) { return array[index]; } nth([‘a’, ‘b’, ‘c’], 1); //=> ‘b’ # Saturday, October 5, 13
    45. 45. Saturday, October 5, 13
    46. 46. Saturday, October 5, 13
    47. 47. Saturday, October 5, 13
    48. 48. id name age 555-55-5555 Moe 45 777-77-7777 Curly 47 0 1 Saturday, October 5, 13
    49. 49. var table = [ {id: ‘555-55-5555’, name: ‘Moe’, age: 45}, {id: ‘777-77-7777’, name: ‘Curly’, age: 47} ]; Saturday, October 5, 13
    50. 50. id name age 555-55-5555 Moe 45 777-77-7777 Curly 47 0 1 Saturday, October 5, 13
    51. 51. #“ Saturday, October 5, 13
    52. 52. function cell(table, col, row){ return table[row][col]; } cell(table, ‘name’, 0); //=> ‘Moe’ cell(table, ‘age’, 0); //=> 45 #“ Saturday, October 5, 13
    53. 53. Larger abstractions built via composition Saturday, October 5, 13
    54. 54. L Clojure, Haskell, ML, Joy, _ Saturday, October 5, 13
    55. 55. Currying, partial application, fixation, oh my! Saturday, October 5, 13
    56. 56. #“ Saturday, October 5, 13
    57. 57. #“ L.fix Saturday, October 5, 13
    58. 58. # L.fix(cell, L._, ‘name’, L._); ‘name’ Saturday, October 5, 13
    59. 59. # 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
    60. 60. #“ L.rot Saturday, October 5, 13
    61. 61. # L.rot(cell); “ Saturday, October 5, 13
    62. 62. #“ L.partial Saturday, October 5, 13
    63. 63. L.partial(L.rot(cell), ‘name’); #‘name’ Saturday, October 5, 13
    64. 64. 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
    65. 65. L.rcurry “ Codd.col(table, ‘name’); //=> [‘Moe’, ‘Curly’] Saturday, October 5, 13
    66. 66. “ “ L.rcurry2(Codd.col); Saturday, October 5, 13
    67. 67. “ L.rcurry2(Codd.col); var valuesFor = L.rcurry2(Codd.col); var allNames = valuesFor(‘name’); allNames(table); //=> [‘Moe’, ‘Curly’] Saturday, October 5, 13
    68. 68. Compositions and Pipelines Saturday, October 5, 13
    69. 69. How to count all of the values in a column? Saturday, October 5, 13
    70. 70. “ function countValues(table, tag) { return L.len(Codd.col(table, tag)); } countValues(table, ‘name’); //=> 2 # Saturday, October 5, 13
    71. 71. L.comp return L.len(Codd.col(table, tag)); First thisThen this Saturday, October 5, 13
    72. 72. “Codd.col # L.len Saturday, October 5, 13
    73. 73. “Codd.col # L.len Saturday, October 5, 13
    74. 74. “ var countValues = L.comp(L.len, Codd.col); countValues(table, ‘name’); //=> 2 # Saturday, October 5, 13
    75. 75. L.pipeline L.pipeline(table, Codd.col(‘name’), L.len); //=> 2 First this Then this Saturday, October 5, 13
    76. 76. codd.js (demo) Relational Algebra Saturday, October 5, 13
    77. 77. Thanks • The NationJS team • O’Reilly • Alan Dipert • Paul Khuong • The Underscore community • The Clojure community Saturday, October 5, 13
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×