Functional thinking in coffee script

56

description

Software Craftsmanship Atlanta - Functional Thinking in CoffeeScript - John Napier, ThoughtWorks

Transcript of Functional thinking in coffee script

FIRST, A QUICK POLL

FIRST, A QUICK POLL

FUNCTIONAL PROGRAMMING EXPERIENCE? (THE 80’S COUNTS)

FIRST, A QUICK POLL

FUNCTIONAL PROGRAMMING EXPERIENCE? (THE 80’S COUNTS)

COFFEESCRIPT EXPERIENCE? (NOBODY LIKES A SHOW OFF)

AN OVER-SIMPLIFIED COMPARISON...

AN OVER-SIMPLIFIED COMPARISON... F U N C T I O N A L L A N G U A G E S

-  NO SIDE EFFECTS DUE TO LEXICAL SCOPING

-  IMMUTABLE OBJECTS -  MONADIC FUNCTIONS

(1-ARITY) -  ITERATION THROUGH

RECURSION

AN OVER-SIMPLIFIED COMPARISON… F U N C T I O N A L L A N G U A G E S

-  NO SIDE EFFECTS DUE TO LEXICAL SCOPING

-  IMMUTABLE OBJECTS -  MONADIC FUNCTIONS

(1-ARITY) -  ITERATION THROUGH

RECURSION

J A V A S C R I P T / C O F F E E S C R I P T

-  SIDE EFFECTS IF YOU WANT THEM, UGH!

-  VERY FEW IMMUTABLE OBJECTS

-  N-ARITY, VARIADIC FUNCTIONS

-  ITERATION TYPICALLY THROUGH CURSORS

A GROSSLY OVER-SIMPLIFIED COMPARISON…

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH -  PLACE PORK

SANDWICH IN MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH -  OPEN MOUTH -  PLACE PORK SANDWICH

IN MOUTH -  RELEASE PORK

SANDWICH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH -  OPEN MOUTH -  PLACE PORK SANDWICH

IN MOUTH -  RELEASE PORK

SANDWICH -  REMOVE HAND FROM

MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH -  OPEN MOUTH -  PLACE PORK SANDWICH IN

MOUTH -  RELEASE PORK SANDWICH -  REMOVE HAND FROM

MOUTH -  CLOSE MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH -  OPEN MOUTH -  PLACE PORK SANDWICH IN

MOUTH -  RELEASE PORK SANDWICH -  REMOVE HAND FROM

MOUTH -  CLOSE MOUTH -  OPEN MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH -  OPEN MOUTH -  PLACE PORK SANDWICH IN

MOUTH -  RELEASE PORK SANDWICH -  REMOVE HAND FROM MOUTH -  CLOSE MOUTH -  OPEN MOUTH -  CLOSE MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH -  PLACE PORK SANDWICH IN MOUTH

-  RELEASE PORK SANDWICH -  REMOVE HAND FROM MOUTH

-  CLOSE MOUTH -  OPEN MOUTH

-  CLOSE MOUTH -  OPEN MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH -  PLACE PORK SANDWICH IN MOUTH

-  RELEASE PORK SANDWICH -  REMOVE HAND FROM MOUTH

-  CLOSE MOUTH -  OPEN MOUTH

-  CLOSE MOUTH -  OPEN MOUTH

-  CLOSE MOUTH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH

-  PLACE PORK SANDWICH IN MOUTH

-  RELEASE PORK SANDWICH

-  REMOVE HAND FROM MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  SWALLOW

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH

-  PLACE PORK SANDWICH IN MOUTH

-  RELEASE PORK SANDWICH

-  REMOVE HAND FROM MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  SWALLOW

D E C L A R A T I V E L A N G U A G E S ( W H A T )

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH

-  PLACE PORK SANDWICH IN MOUTH

-  RELEASE PORK SANDWICH

-  REMOVE HAND FROM MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  SWALLOW

D E C L A R A T I V E L A N G U A G E S ( W H A T )

-  EAT PORK SANDWICH

A GROSSLY OVER-SIMPLIFIED COMPARISON… I M P E R A T I V E L Y L A N G U A G E S

( H O W )

-  USING FREE HAND, PICK UP PORK SANDWICH

-  RAISE HAND TO MOUTH

-  OPEN MOUTH

-  PLACE PORK SANDWICH IN MOUTH

-  RELEASE PORK SANDWICH

-  REMOVE HAND FROM MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  OPEN MOUTH

-  CLOSE MOUTH

-  SWALLOW

D E C L A R A T I V E L A N G U A G E S ( W H A T )

-  EAT PORK SANDWICH

(I SAID “GROSSLY”)

…WHICH LEADS US TO A FEW CAVEATS

…WHICH LEADS US TO A FEW CAVEATS

COFFEESCRIPT IS NOT PURELY FUNCTIONAL

…WHICH LEADS US TO A FEW CAVEATS

COFFEESCRIPT IS NOT PURELY FUNCTIONAL

WE DON’T REALLY CARE

…WHICH LEADS US TO A FEW CAVEATS

COFFEESCRIPT IS NOT PURELY FUNCTIONAL

WE DON’T REALLY CARE

IT’S JUST JAVASCRIPT

WITH THAT, LET’S GET STARTED (WHY YOU’RE REALLY HERE)

PROBLEM 1†

IF WE LIST ALL THE NATURAL NUMBERS BELOW 10 THAT ARE MULTIPLES OF 3 OR 5, WE GET 3, 5, 6 AND 9. THE SUM OF THESE MULTIPLES IS 23.

FIND THE SUM OF ALL THE MULTIPLES OF 3 OR 5 BELOW 1000.

† HTTP://PROJECTEULER.NET/PROBLEM=1

PROBLEM 1†

IF WE LIST ALL THE NATURAL NUMBERS BELOW 10 THAT ARE MULTIPLES OF 3 OR 5, WE GET 3, 5, 6 AND 9. THE SUM OF THESE MULTIPLES IS 23.

FIND THE SUM OF ALL THE MULTIPLES OF 3 OR 5 BELOW 1000.

† HTTP://PROJECTEULER.NET/PROBLEM=1

(VOLUNTEERS?)

PROBLEM 1†

IF WE LIST ALL THE NATURAL NUMBERS BELOW 10 THAT ARE MULTIPLES OF 3 OR 5, WE GET 3, 5, 6 AND 9. THE SUM OF THESE MULTIPLES IS 23.

FIND THE SUM OF ALL THE MULTIPLES OF 3 OR 5 BELOW 1000.

† HTTP://PROJECTEULER.NET/PROBLEM=1

FUNCTIONS WE’LL USE: FILTER, REDUCE

[1, 2, 3, 4].FILTER(FUNCTION(X){

RETURN X % 2 == 0;

});

//-> [2, 4]

[‘THE’, ‘RAIN’, ‘IN’, ‘SPAIN’].FILTER(

FUNCTION(WORD){

RETURN WORD.LENGTH > 4;

}

);

//-> [‘SPAIN’]

[2, 4, 6].REDUCE(FUNCTION(SUM, X){

RETURN SUM + X;

});

//-> 12

[1, 2, 3].REDUCE(

FUNCTION(STR, X){

RETURN STR + ‘…‘ + X;

}, ‘TESTING…TESTING’

);

//-> ‘TESTING…TESTING…1…2…3’

JAVASCRIPT

544 CHARACTERS

COFFEESCRIPT

248 CHARACTERS

PROBLEM 2†

THE SUM OF THE SQUARES OF THE FIRST TEN NATURAL NUMBERS IS,

1^2 + 2^2 + ... + 10^2 = 385

THE SQUARE OF THE SUM OF THE FIRST TEN NATURAL NUMBERS IS,

(1 + 2 + ... + 10)^2 = 55^2 = 3025

HENCE THE DIFFERENCE BETWEEN THE SUM OF THE SQUARES OF THE FIRST TEN NATURAL NUMBERS AND THE SQUARE OF THE SUM IS 3025 - 385 = 2640.

FIND THE DIFFERENCE BETWEEN THE SUM OF THE SQUARES OF THE FIRST ONE HUNDRED NATURAL NUMBERS AND THE SQUARE OF THE SUM.

† HTTP://PROJECTEULER.NET/PROBLEM=6

PROBLEM 2†

THE SUM OF THE SQUARES OF THE FIRST TEN NATURAL NUMBERS IS,

1^2 + 2^2 + ... + 10^2 = 385

THE SQUARE OF THE SUM OF THE FIRST TEN NATURAL NUMBERS IS,

(1 + 2 + ... + 10)^2 = 55^2 = 3025

HENCE THE DIFFERENCE BETWEEN THE SUM OF THE SQUARES OF THE FIRST TEN NATURAL NUMBERS AND THE SQUARE OF THE SUM IS 3025 - 385 = 2640.

FIND THE DIFFERENCE BETWEEN THE SUM OF THE SQUARES OF THE FIRST ONE HUNDRED NATURAL NUMBERS AND THE SQUARE OF THE SUM.

† HTTP://PROJECTEULER.NET/PROBLEM=6

(VOLUNTEERS?)

PROBLEM 2†

THE SUM OF THE SQUARES OF THE FIRST TEN NATURAL NUMBERS IS,

1^2 + 2^2 + ... + 10^2 = 385

THE SQUARE OF THE SUM OF THE FIRST TEN NATURAL NUMBERS IS,

(1 + 2 + ... + 10)^2 = 55^2 = 3025

HENCE THE DIFFERENCE BETWEEN THE SUM OF THE SQUARES OF THE FIRST TEN NATURAL NUMBERS AND THE SQUARE OF THE SUM IS 3025 - 385 = 2640.

FIND THE DIFFERENCE BETWEEN THE SUM OF THE SQUARES OF THE FIRST ONE HUNDRED NATURAL NUMBERS AND THE SQUARE OF THE SUM.

† HTTP://PROJECTEULER.NET/PROBLEM=6

FUNCTIONS WE’LL USE: MAP, REDUCE

[‘ALAN’, ‘BOB’, ‘FRANK’].MAP(FUNCTION(NAME){

RETURN NAME.LENGTH;

});

//-> [4, 3, 5]

[1, 2, 3].MAP(FUNCTION(X){

RETURN X * X;

});

//-> [1, 4, 9]

JAVASCRIPT

547 CHARACTERS

COFFEESCRIPT

263 CHARACTERS

PROBLEM 3†

A PALINDROMIC NUMBER READS THE SAME BOTH WAYS. THE LARGEST PALINDROME MADE FROM THE PRODUCT OF TWO 2-DIGIT NUMBERS IS 9009 = 91 X 99.

FIND THE LARGEST PALINDROME MADE FROM THE PRODUCT OF TWO 3-DIGIT NUMBERS.

† HTTP://PROJECTEULER.NET/PROBLEM=4

PROBLEM 3†

A PALINDROMIC NUMBER READS THE SAME BOTH WAYS. THE LARGEST PALINDROME MADE FROM THE PRODUCT OF TWO 2-DIGIT NUMBERS IS 9009 = 91 X 99.

FIND THE LARGEST PALINDROME MADE FROM THE PRODUCT OF TWO 3-DIGIT NUMBERS.

† HTTP://PROJECTEULER.NET/PROBLEM=4

(VOLUNTEERS?)

PROBLEM 3†

A PALINDROMIC NUMBER READS THE SAME BOTH WAYS. THE LARGEST PALINDROME MADE FROM THE PRODUCT OF TWO 2-DIGIT NUMBERS IS 9009 = 91 X 99.

FIND THE LARGEST PALINDROME MADE FROM THE PRODUCT OF TWO 3-DIGIT NUMBERS.

† HTTP://PROJECTEULER.NET/PROBLEM=4

FUNCTIONS WE’LL USE: MAP, FILTER, REDUCE

JAVASCRIPT

1,068 CHARACTERS

COFFEESCRIPT

462 CHARACTERS

OKAY JOHN, VERY GOOD. (ANYTHING USEFUL TODAY?)

REALISTIC PROBLEM

ASSUME WE HAVE A BUNCH OF DOCUMENTS, REPRESENTED AS STRINGS (YES, AN ANEMIC DOMAIN. I SAID IT’D BE REALISTIC).

DESIGN A DOCUMENT DATABASE THAT TAKES A COLLECTION OF DOCUMENTS AND RETURNS THE SIZE OF THE LARGEST ONE

REALISTIC PROBLEM

ASSUME WE HAVE A BUNCH OF DOCUMENTS, REPRESENTED AS STRINGS (YES, AN ANEMIC DOMAIN. I SAID IT’D BE REALISTIC).

DESIGN A DOCUMENT DATABASE THAT TAKES A COLLECTION OF DOCUMENTS AND RETURNS THE SIZE OF THE LARGEST ONE

(VOLUNTEERS?)

JAVASCRIPT

642 CHARACTERS

JAVASCRIPT

601 CHARACTERS

COFFEESCRIPT

546 CHARACTERS

COFFEESCRIPT

278 CHARACTERS

QUESTIONS BEFORE WE PAIR? (OR DURING, THAT’S COOL TOO)

PAIRING CHALLENGE

A COLLATZ SEQUENCE TAKES A NUMBER. IF THAT NUMBER IS EVEN, IT’S DIVIDED BY BY 2. IF IT’S ODD, IT’S MULTIPLIED BY 3 AND ADDED TO 1. THE RESULTING

NUMBER IS THEN REAPPLIED TO THE COLLATZ FORMULA, UNTIL WE GET BACK THE NUMBER 1, AT WHICH POINT THE COLLATZ SEQUENCE TERMINATES.

FOR ALL STARTING NUMBERS BETWEEN 1 AND 100, HOW MANY COLLATZ SEQUENCES HAVE A LENGTH GREATER THAN 15?