SlideShare ist ein Scribd-Unternehmen logo
1 von 21
Downloaden Sie, um offline zu lesen
Introducing ƒancy
Writing functional javascript that can hit production
Write performant, stable, readable,
debuggable, and production worthy code
quickly.
In short, to make life easier.
I won't invoke complex vocabulary, math, and
theory; I don't need to.
What is my goal here?
What is functional programming?
● Avoids State
● Emphasizes application of functions
● Avoids side-effects
● Combines functions
● Solves problems conceptually (no loops)
What is fancy?
Fancy is a mashup:
a. Underscore.js functions (Jeremy Ashkenas)
b. Functional.js features (Oliver Steele)
c. 1-off pseudo-arrays much like a jQuery collection
d. And some other functions I felt were needed
(chunk)
FancyArray([1,2,3]).sortBy("%2");
>>> [2, 1, 3]
a b
c
Wait, how do I use this?
1. Construct a FancyArray([foo, bar]) from any array.
Construct a FancyObject({foo: bar}) from an object.
2. Call normal underscore functions on your FancyArray (or object).
3. When one of those calls would return an array, it instead returns a
FancyArray, thus allowing chaining. When one of underscore's functions
would have returned an object, it instead returns a FancyObject.
However, unlike underscore's .chain method, these one-off objects act very
much like normal arrays or objects.
And-
Also, any function that takes another function as an
argument (like map) can take a string to represent that
function as devised by Oliver Steele
FancyArray([1,2,3]).map("*2")
>> [2,4,6]
FancyArray([1,2,3]).map("12/x")
>> [12,6,4]
FancyArray([1,2,3]).map("x,y->x+y")
>> [1,3,5]
Like this:
var samplePeople = new FancyObject(
{
0: {name: "Alice", age: 15, ranking: 3, team: 2},
1: {name: "David", age: 25, ranking: 2, team: 1},
2: {name: "Charlie", age: 32, ranking: 4, team: 1},
3: {name: "Bob", age: 24, ranking: 1, team: 4}
});
samplePeople.values().sortBy(".age").pluck("name");
>>>["Alice", "Bob", "David", "Charlie"]
Returns a FancyArray
Though you may not see
from the chrome console
output, this is still a
FancyArray
Functional.js style function
How does that make my life easier?
You can read your code left-to-right, like english
It's now shorter than declarative, with less ugly nesting.
No pollution of public scope or prototypes.
var samplePeople = { ... };
// fancy - This is prettier
FO(samplePeople).values().sortBy( ".age").pluck("name");
// plain underscore - Than that
_.chain(samplePeople).values().sortBy(
function(p) { return p.age; }).pluck( "name").value();
Let's consider a sample problem
● Not fibonacci
● Not prime numbers
● Not foobar or fizzbuzz.
Evaluating poker hands.
How do poker hands work?
1st - Hand Types:
1. Straight Flush
2. 4 of a kind
3. Full-House
4. Flush
5. Straight
6. 3 of a kind
7. 2 Pair
8. 1 Pair
9. High card
2nd - Card Values
How high are the cards
used to make up the
hand?
3rd - Card Values
How high are the
remaining cards in the
hand?
Example:
Full House:
3 Of 1 value
2 Of another Value
Beats lower ranking hands
(like a straight). Loses
to higher-ranking hands.
(Straight flush).
If two full houses happen, compare the sets of 3, whichever has the higher
value wins. If those are equal, compare the pairs of two, whichever has the
higher value wins. If those are equal, then the hands are equal.
A lame approach
// A non-functional approach might involve defining a lot of functions that
// look something like this
/**
* Returns true if hand is full-house
*/
function isFullHouse(cards) {
var differentCards = [] ;
for (var x=0; x < cards.length; x++) {
differentCards[ valueOf( cards[x] ) ]++;
}
return (differentCards. indexOf(3) > 0) && (differentCards. indexOf(2) >
0);
}
function compareTwoFullHouses (fullhouse1, fullhouse2) {
...
Let's think about this...
What do poker hands have in common?
● 6 hands: Sets of Cards that are the same value.
● 2 hands: Cards that have consecutive value
● 2 hands: Cards that are all the same suit.
Or
● 8 hands: Counts of cards that share sameness on an attribute
● 2 hands: Cards that have consecutive value
Coming up with an algorithm
1. Take the hand. Extract relevant
attribute. In this case, it means turn
[ "3D", "3S", "6D", "2C", "2H"]
into :
[ 3, 3, 6, 2, 2]
2. Find groups of cards. Turn it
into
{3: 2, 6: 1, 2: 2} (meaning two threes, a six, and a pair of twos)
3. Compare this to the hand definition.
4. (For ties) Find a way to convey the second and third characteristics (in this
case, that 6 of diamonds).
A functional approach
[
["Full House", followsPattern(cards, [3,2], cardValues)],
["2 Pair", followsPattern(cards, [2,2,1], cardValues)],
["Flush", followsPattern(cards, [5], cardSuits)],
]
var followsPattern = function(hand, expected, callback) {
var values = FA(hand).map(callback); //Turn the input to an array of numbers
var groups = values.countBy(); //Get the counts of duplicates
if (! groups.values().hasAll(expected)) {
return false; //This hand is NOT of the expected type, no match
}
var sets = groups.pairs(); //Turn {2: 3, 8: 2} into [[2, 3], [8, 2]] for example
sets = sets.sortBy('x[1] + "" + x[0]');
//take advantage of alphabetical sort, sort by cardCount,
// then card Value alpha in a tie
return sets.pluck(0).join("");//pluck the first item, the cardValueAlpha
};
Example Helper Function
/**
* return true if every value in needle is in this array,
* at least as many times.
*/
FancyArray.prototype.hasAll = function(needle) {
var summed = this.countBy().meld(
FA(needle).countBy().mapObj( "a*-1"),
"a+b");
return summed.values().every( ">=0");
};
So... Is it really better?
Advantages:
● Less Code
● More Dry
● Easier to keep track of
● Easier to extend (say
make it work with
hold'em)
● A little faster to write
Disadvantages:
● Perhaps scary at first
● A little harder to
wrap your brain
around
● Could be off-putting
to collaborators who
know nothing about
the notation.
YES.
Is this really functional programming?
Isn't there more than this to functional programming?
A challenge has been leveraged at underscore, namely by Brian
Lonsdorf. In his talk, "Underscore, You're doing it wrong" in which he
challenged whether underscore really enabled functional
programming. In short he argued that underscore's notation impeded
currying and composition.
It's a fair criticism, and one that applies equally well to the
ecmascript 5 standard which put map in the array.prototype. Really,
you can't map to another map eloquently or do other advanced
functional programming things with the same grace. However, this
isn't a big issue for the vast majority of users.
How does it stack up?
● Avoids State
● Emphasizes use of functions
● Avoids side-effects
● Combines functions
● Solves problems conceptually
Call it whatever you want. The important thing is that you
get the ability to write good, reusable, abstracted code
easily. Don't optimize for an edge-case.
Thanks
Questions?
Links:
https://github.com/anfurny/fancy
http://blog.alexrohde.com/
Source Libraries:
http://underscorejs.org/
http://osteele.com/sources/javascript/functional/

Weitere ähnliche Inhalte

Was ist angesagt?

Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014hwilming
 
Powerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesPowerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesDragos Ionita
 
ECMAScript 6 and beyond
ECMAScript 6 and beyondECMAScript 6 and beyond
ECMAScript 6 and beyondFrancis Johny
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of AtrocityMichael Pirnat
 
Advanced Python, Part 1
Advanced Python, Part 1Advanced Python, Part 1
Advanced Python, Part 1Zaar Hai
 
Slides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersSlides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersGiovanni924
 
Testing for share
Testing for share Testing for share
Testing for share Rajeev Mehta
 
あたかも自然言語を書くようにコーディングしてみる
あたかも自然言語を書くようにコーディングしてみるあたかも自然言語を書くようにコーディングしてみる
あたかも自然言語を書くようにコーディングしてみるKazuya Numata
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScriptDonald Sipe
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsMichael Pirnat
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation JavascriptRamesh Nair
 
(Parameterized) Roles
(Parameterized) Roles(Parameterized) Roles
(Parameterized) Rolessartak
 
P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)lichtkind
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Alexander Granin
 
Stamps - a better way to object composition
Stamps - a better way to object compositionStamps - a better way to object composition
Stamps - a better way to object compositionVasyl Boroviak
 

Was ist angesagt? (20)

Core concepts-javascript
Core concepts-javascriptCore concepts-javascript
Core concepts-javascript
 
JavaScript Patterns
JavaScript PatternsJavaScript Patterns
JavaScript Patterns
 
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
Exploring Ceylon with Gavin King - JUG BB Talk - Belrin 2014
 
Powerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesPowerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best Practices
 
ECMAScript 6 and beyond
ECMAScript 6 and beyondECMAScript 6 and beyond
ECMAScript 6 and beyond
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of Atrocity
 
Advanced Python, Part 1
Advanced Python, Part 1Advanced Python, Part 1
Advanced Python, Part 1
 
Slides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersSlides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammers
 
Testing for share
Testing for share Testing for share
Testing for share
 
あたかも自然言語を書くようにコーディングしてみる
あたかも自然言語を書くようにコーディングしてみるあたかも自然言語を書くようにコーディングしてみる
あたかも自然言語を書くようにコーディングしてみる
 
C++ L09-Classes Part2
C++ L09-Classes Part2C++ L09-Classes Part2
C++ L09-Classes Part2
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
C++ L08-Classes Part1
C++ L08-Classes Part1C++ L08-Classes Part1
C++ L08-Classes Part1
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
 
(Parameterized) Roles
(Parameterized) Roles(Parameterized) Roles
(Parameterized) Roles
 
P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++
 
C++ L10-Inheritance
C++ L10-InheritanceC++ L10-Inheritance
C++ L10-Inheritance
 
Stamps - a better way to object composition
Stamps - a better way to object compositionStamps - a better way to object composition
Stamps - a better way to object composition
 

Ähnlich wie Fancy talk

BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...Andrew Phillips
 
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...Andrew Phillips
 
What can scala puzzlers teach us
What can scala puzzlers teach usWhat can scala puzzlers teach us
What can scala puzzlers teach usDaniel Sobral
 
Java best practices
Java best practicesJava best practices
Java best practicesRay Toal
 
Go Beyond Higher Order Functions: A Journey into Functional Programming
Go Beyond Higher Order Functions: A Journey into Functional ProgrammingGo Beyond Higher Order Functions: A Journey into Functional Programming
Go Beyond Higher Order Functions: A Journey into Functional ProgrammingLex Sheehan
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)Pavlo Baron
 
Introduction to Scala for JCConf Taiwan
Introduction to Scala for JCConf TaiwanIntroduction to Scala for JCConf Taiwan
Introduction to Scala for JCConf TaiwanJimin Hsieh
 
Functional programming in ruby
Functional programming in rubyFunctional programming in ruby
Functional programming in rubyKoen Handekyn
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
Real World Haskell: Lecture 1
Real World Haskell: Lecture 1Real World Haskell: Lecture 1
Real World Haskell: Lecture 1Bryan O'Sullivan
 
Introduction to Client-Side Javascript
Introduction to Client-Side JavascriptIntroduction to Client-Side Javascript
Introduction to Client-Side JavascriptJulie Iskander
 
Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1Troy Miles
 
Python Workshop - Learn Python the Hard Way
Python Workshop - Learn Python the Hard WayPython Workshop - Learn Python the Hard Way
Python Workshop - Learn Python the Hard WayUtkarsh Sengar
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fuclimatewarrior
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonPython Ireland
 

Ähnlich wie Fancy talk (20)

BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
BASE Meetup: "Analysing Scala Puzzlers: Essential and Accidental Complexity i...
 
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
Scala Up North: "Analysing Scala Puzzlers: Essential and Accidental Complexit...
 
What can scala puzzlers teach us
What can scala puzzlers teach usWhat can scala puzzlers teach us
What can scala puzzlers teach us
 
Java best practices
Java best practicesJava best practices
Java best practices
 
Go Beyond Higher Order Functions: A Journey into Functional Programming
Go Beyond Higher Order Functions: A Journey into Functional ProgrammingGo Beyond Higher Order Functions: A Journey into Functional Programming
Go Beyond Higher Order Functions: A Journey into Functional Programming
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Introduction to Scala for JCConf Taiwan
Introduction to Scala for JCConf TaiwanIntroduction to Scala for JCConf Taiwan
Introduction to Scala for JCConf Taiwan
 
Functional programming in ruby
Functional programming in rubyFunctional programming in ruby
Functional programming in ruby
 
Scala ntnu
Scala ntnuScala ntnu
Scala ntnu
 
[Start] Scala
[Start] Scala[Start] Scala
[Start] Scala
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
Real World Haskell: Lecture 1
Real World Haskell: Lecture 1Real World Haskell: Lecture 1
Real World Haskell: Lecture 1
 
Introduction to Client-Side Javascript
Introduction to Client-Side JavascriptIntroduction to Client-Side Javascript
Introduction to Client-Side Javascript
 
Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1Game Design and Development Workshop Day 1
Game Design and Development Workshop Day 1
 
C Tutorials
C TutorialsC Tutorials
C Tutorials
 
Python Workshop - Learn Python the Hard Way
Python Workshop - Learn Python the Hard WayPython Workshop - Learn Python the Hard Way
Python Workshop - Learn Python the Hard Way
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
Javascript Best Practices
Javascript Best PracticesJavascript Best Practices
Javascript Best Practices
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fu
 
Object Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in PythonObject Orientation vs. Functional Programming in Python
Object Orientation vs. Functional Programming in Python
 

Kürzlich hochgeladen

WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
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...Martijn de Jong
 

Kürzlich hochgeladen (20)

WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
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...
 

Fancy talk

  • 1. Introducing ƒancy Writing functional javascript that can hit production
  • 2. Write performant, stable, readable, debuggable, and production worthy code quickly. In short, to make life easier. I won't invoke complex vocabulary, math, and theory; I don't need to. What is my goal here?
  • 3. What is functional programming? ● Avoids State ● Emphasizes application of functions ● Avoids side-effects ● Combines functions ● Solves problems conceptually (no loops)
  • 4. What is fancy? Fancy is a mashup: a. Underscore.js functions (Jeremy Ashkenas) b. Functional.js features (Oliver Steele) c. 1-off pseudo-arrays much like a jQuery collection d. And some other functions I felt were needed (chunk) FancyArray([1,2,3]).sortBy("%2"); >>> [2, 1, 3] a b c
  • 5. Wait, how do I use this? 1. Construct a FancyArray([foo, bar]) from any array. Construct a FancyObject({foo: bar}) from an object. 2. Call normal underscore functions on your FancyArray (or object). 3. When one of those calls would return an array, it instead returns a FancyArray, thus allowing chaining. When one of underscore's functions would have returned an object, it instead returns a FancyObject. However, unlike underscore's .chain method, these one-off objects act very much like normal arrays or objects.
  • 6. And- Also, any function that takes another function as an argument (like map) can take a string to represent that function as devised by Oliver Steele FancyArray([1,2,3]).map("*2") >> [2,4,6] FancyArray([1,2,3]).map("12/x") >> [12,6,4] FancyArray([1,2,3]).map("x,y->x+y") >> [1,3,5]
  • 7. Like this: var samplePeople = new FancyObject( { 0: {name: "Alice", age: 15, ranking: 3, team: 2}, 1: {name: "David", age: 25, ranking: 2, team: 1}, 2: {name: "Charlie", age: 32, ranking: 4, team: 1}, 3: {name: "Bob", age: 24, ranking: 1, team: 4} }); samplePeople.values().sortBy(".age").pluck("name"); >>>["Alice", "Bob", "David", "Charlie"] Returns a FancyArray Though you may not see from the chrome console output, this is still a FancyArray Functional.js style function
  • 8. How does that make my life easier? You can read your code left-to-right, like english It's now shorter than declarative, with less ugly nesting. No pollution of public scope or prototypes. var samplePeople = { ... }; // fancy - This is prettier FO(samplePeople).values().sortBy( ".age").pluck("name"); // plain underscore - Than that _.chain(samplePeople).values().sortBy( function(p) { return p.age; }).pluck( "name").value();
  • 9. Let's consider a sample problem ● Not fibonacci ● Not prime numbers ● Not foobar or fizzbuzz. Evaluating poker hands.
  • 10. How do poker hands work? 1st - Hand Types: 1. Straight Flush 2. 4 of a kind 3. Full-House 4. Flush 5. Straight 6. 3 of a kind 7. 2 Pair 8. 1 Pair 9. High card 2nd - Card Values How high are the cards used to make up the hand? 3rd - Card Values How high are the remaining cards in the hand?
  • 11. Example: Full House: 3 Of 1 value 2 Of another Value Beats lower ranking hands (like a straight). Loses to higher-ranking hands. (Straight flush). If two full houses happen, compare the sets of 3, whichever has the higher value wins. If those are equal, compare the pairs of two, whichever has the higher value wins. If those are equal, then the hands are equal.
  • 12. A lame approach // A non-functional approach might involve defining a lot of functions that // look something like this /** * Returns true if hand is full-house */ function isFullHouse(cards) { var differentCards = [] ; for (var x=0; x < cards.length; x++) { differentCards[ valueOf( cards[x] ) ]++; } return (differentCards. indexOf(3) > 0) && (differentCards. indexOf(2) > 0); } function compareTwoFullHouses (fullhouse1, fullhouse2) { ...
  • 13. Let's think about this... What do poker hands have in common? ● 6 hands: Sets of Cards that are the same value. ● 2 hands: Cards that have consecutive value ● 2 hands: Cards that are all the same suit. Or ● 8 hands: Counts of cards that share sameness on an attribute ● 2 hands: Cards that have consecutive value
  • 14. Coming up with an algorithm 1. Take the hand. Extract relevant attribute. In this case, it means turn [ "3D", "3S", "6D", "2C", "2H"] into : [ 3, 3, 6, 2, 2] 2. Find groups of cards. Turn it into {3: 2, 6: 1, 2: 2} (meaning two threes, a six, and a pair of twos) 3. Compare this to the hand definition. 4. (For ties) Find a way to convey the second and third characteristics (in this case, that 6 of diamonds).
  • 15. A functional approach [ ["Full House", followsPattern(cards, [3,2], cardValues)], ["2 Pair", followsPattern(cards, [2,2,1], cardValues)], ["Flush", followsPattern(cards, [5], cardSuits)], ] var followsPattern = function(hand, expected, callback) { var values = FA(hand).map(callback); //Turn the input to an array of numbers var groups = values.countBy(); //Get the counts of duplicates if (! groups.values().hasAll(expected)) { return false; //This hand is NOT of the expected type, no match } var sets = groups.pairs(); //Turn {2: 3, 8: 2} into [[2, 3], [8, 2]] for example sets = sets.sortBy('x[1] + "" + x[0]'); //take advantage of alphabetical sort, sort by cardCount, // then card Value alpha in a tie return sets.pluck(0).join("");//pluck the first item, the cardValueAlpha };
  • 16. Example Helper Function /** * return true if every value in needle is in this array, * at least as many times. */ FancyArray.prototype.hasAll = function(needle) { var summed = this.countBy().meld( FA(needle).countBy().mapObj( "a*-1"), "a+b"); return summed.values().every( ">=0"); };
  • 17. So... Is it really better? Advantages: ● Less Code ● More Dry ● Easier to keep track of ● Easier to extend (say make it work with hold'em) ● A little faster to write Disadvantages: ● Perhaps scary at first ● A little harder to wrap your brain around ● Could be off-putting to collaborators who know nothing about the notation.
  • 18. YES.
  • 19. Is this really functional programming? Isn't there more than this to functional programming? A challenge has been leveraged at underscore, namely by Brian Lonsdorf. In his talk, "Underscore, You're doing it wrong" in which he challenged whether underscore really enabled functional programming. In short he argued that underscore's notation impeded currying and composition. It's a fair criticism, and one that applies equally well to the ecmascript 5 standard which put map in the array.prototype. Really, you can't map to another map eloquently or do other advanced functional programming things with the same grace. However, this isn't a big issue for the vast majority of users.
  • 20. How does it stack up? ● Avoids State ● Emphasizes use of functions ● Avoids side-effects ● Combines functions ● Solves problems conceptually Call it whatever you want. The important thing is that you get the ability to write good, reusable, abstracted code easily. Don't optimize for an edge-case.