functional phpscala - (1 to 10).sum haskell - sum[1..10] the scale pure - haskell middle ground -...

63
FUNCTIONAL PHP SIMON HOLYWELL 12/05/2014 0

Upload: others

Post on 22-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

FUNCTIONAL PHPSIMON HOLYWELL

12/05/2014

0

Page 2: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

WHO?Lead developerMosaic in BrightonFull service agency@ on TwitterTreffynnonSimonHolywell.com

Page 3: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

WORKWeb appsObligatory CMS!

Page 4: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

PROJECTSMaintainer of ssdeep - and extension

- geo library for PHP

- Node.js bot for GTalk - now defunct :(

Idiorm and ParisPECL HHVM

NavigatorPHP-at-Job-Queue-Wrappernjsbot

Page 5: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

FUNCTIONS IN PHPRarely employedDiscouraged by PHP's evolutionNaming collisionsThe old name spacing object

Page 6: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

SIMPLE BEASTSPHP functions are:

EasyContainedUnaware of global stateCan now be namespaced

Page 7: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

FUNCTION<?phpfunction hello($arg = 'World') { echo __FUNCTION__ . " $arg";}hello(); // hello World

Page 8: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

A LITTLE BIT OF HISTORYI started with PHP3Functions were the normClasses merely wrapped themOOP was very poorly understood

Page 9: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

DRYMost mashed code with HTMLFunctions promoted code reuseHTML then had functions in it!

Page 10: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

EVOLVECome PHP4 you get better OOPFunctions no longer in focusThey become seen poorer cousinsCan't carry context vs. class properties

Page 11: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

PHP5Functions are still marginalisedStill seen as spaghettiThe bad way

Page 12: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

PHP5.3+Proper anonymous functionsWe get closures!

Page 13: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

THE BASICS ARE INPLACE

¡Functional is possible!

Page 14: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

JUST WHAT ISFUNCTIONAL?

Programming without assignmentStatelessPure

Page 15: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

WITHOUT ASSIGNMENT...Say goodbye to

$var = 'value';

$ClassInstance->property = 'value';

Page 16: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

STATELESS AND PURENo:

GlobalsSide effectsIncrementors/accumulatorsFor, while or foreach loops

Page 17: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

PASSING VALUESFrom function to function as

ArgumentsReturn values

Page 18: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

10How would you sum all the integers from one to ten?

Page 19: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

IMPERATIVE WAY<?php$sum = 0;for($i = 1; $i <= 10; $i++) { $sum += $i;}// $sum = 55

Page 20: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

FUNCTIONAL WAY<?phparray_sum(range(1, 10));

More descriptiveRemoves state ($sum)Reusable components

Page 21: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

LIKE WELL-DESIGNEDOOP

EncapsulatedBroken down into small chunksReusable

Page 22: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

CAN IT BE NEATER?<?phparray_sum(range(1, 10));

Lua - s=0; for i=1,10 do s=s+i endErlang - lists:sum(lists:seq(1, 10)).Clojure - (reduce + (range (inc 10)))Ruby - (1..10).inject(0) {|s,i| s + i}Python - sum(range(1, 10 + 1))F# - List.sum [1 .. 10]Scala - (1 to 10).sumHaskell - sum[1..10]

Page 23: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

THE SCALEPure - HaskellMiddle ground - Scala and ClojureDabbling - PHP and PythonHopeless - Brainfuck

%

Page 24: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

FUNCTIONAL HISTORYKurt Gödel - recursively calculated functions - 1930sHaskell Curry - combinatory logic - 1927Alan Turing - machines calculating from inputs - 1936Alonzo Church - lambda calculus - 1930s

Page 25: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

LAMBDA CALCULUSMathematical functions - abstractionAccept functions as parametersReturn other functionsBasis of functional programming

Page 26: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

COMBINATORY LOGICHaskell CurryCombinatory calculus - 1927Primitive functions combined to build othersNamed after him

CurryingHaskell

Page 27: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

WORLD WAR IIVienna/Göttingen unsafeGreat minds move to US or UKTuring involved in code breaking

Page 28: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

ACADEMICLittle activity 'til late 1950s

Page 29: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

LISP1958Jon McCarthyMITBecame the standard for AI

Page 30: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

TELEPHONESFault tolerant systemErlang by Ericsson1980s

Page 31: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

ERICSSONEricssonErlangHighly symbolic to improve productivityLisp and Prolog discountedFocused on

ReliabilityConcurrency

Page 32: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

HASKELLFormed by committeePure functional language

Page 33: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

COMMERCIAL ADOPTIONDomain specific languages (DSL)Type handlingPattern matchingFast to build complex parsersLess code = easier to maintain

Page 34: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

CASESTUDYBarclays bankFunctional Payout FrameworkWritten in HaskellDSL for mathematiciansBuilds trading applicationsFunctional eased scope creap

^

Page 35: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

NONE SHALL PASS!<?php$allowable_ips = array( '192.168.0.', '8.8.8.8',);

array_filter($allowable_ips, function($ip) { return $ip == substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip));}) ?: die('Denied.');

Page 36: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

ARRAY_FILTER()<?phparray_filter($allowable_ips, function($ip) {

Takes a list and predicate"Removes" items when predicate failsλ or anonymous functionAnd hey, it's a loop!

Page 37: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

THA PREDICATE<?phpfunction($ip) { return $ip == substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip));}

IP v.4 addressesChops user IP to same length as allowable ($ip)Compares result for equality

Page 38: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

KILLER CONDITION<?php ?: die('Denied.');

Empty arrays == falseTerminates applicationTernary shortcut

<?phpexpr1 ? expr2 : expr3;expr1 ?: expr3;

Page 39: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

WHAT SAY THE BLACKKNIGHT?

<?php// $_SERVER['REMOTE_ADDR'] = '192.168.'$allowable_ips = array( '192.168.0.', '8.8.8.8',);array_filter($allowable_ips, function($ip) { return $ip == substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip));}) ?: die('Denied.');

Page 40: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

BONUS: ARRAY CLEANERarray_filter() without a predicateEntries == false droppedfalse == "" == 0 == array() == null == '0' == 0.0

<?phparray_filter(array('', 's', 0));// array('s')

Page 41: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

BENEFITS OFFUNCTIONAL

Techniques useful for OOPAbstraction = more readable

No distracting guffJust the problem solving stuff

Page 42: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

...AND MOREShorter code = quicker to debugNo global state to assemble in mind

Focus on the hard problems

Page 43: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

HEY! WAIT THERE'SSTILL MORE

Testing is easierNo globals againValues are final

Page 44: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

REFERENTIALTRANSPARENCYReplace any function with it's return valueAlgorithm still works!

<?phparray_sum(array(1,2,3,4,5,6,7,8,9,10));// Is still 55!

Can you do that to a for loop?

Page 45: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

NO!<?php$sum = 0;for($i = 1; $i <= 10; $i++) { $sum += $i;}// $sum = 55

Closest:

<?php$sum = 0;$sum += 1;$sum += 2;...$sum += 10;// $sum = 55

Page 46: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

SO WHAT ELSE?Easier parallel processingWho's using the other cores in your CPU?Not common in PHP - see pthreads

Page 47: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

IF PHP WERE REALLYFUNCTIONAL

Machine optimisation of codeLazy-evaluationHot code deployment (Erlang!)

%

Page 48: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

STEP BACK - Λλlambda functionanonymous function

<?php$func_name = function($param) { return $param;};

Page 49: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

SHOULD BE FAMILIAR<?phpspl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php';});

If not - how about in JS:

button.onclick = function() { alert('Lambda');};

Page 50: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

EXTEND IT - CLOSUREJust like a lambda

, with context/data ($value)

<?php$value = 5;$func_name = function($param) use ($value) { return $param + $value;};echo $func_name(3); // 8

Vars can be other closures or lambdas tooNo aliasing unfortunately

Page 51: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

MAParray_map()

Applies function to each elementReturns new array with adjusted elements

<?phparray_map( function($v) { return strtoupper(++$v); }, $array);

array('o', 'g', 'o') becomes array('P', 'H', 'P')

Page 52: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

REDUCEarray_reduce()

Fold array down to one valueApplies function to each element

<?phparray_reduce( $array, function($result, $v) { return $result .= $v; });

array('o', 'g', 'o') becomes ogo

Page 53: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

MAP AND REDUCECombined to great effect

<?php$a = array('o', 'g', 'o');array_reduce( array_map(function($v) { return strtoupper(++$v); }, $a), function($result, $v) { return $result .= $v; });// PHP

Page 54: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

RECURSIONJust like the meaning of PHPA function that calls itself

Directly orIndirectly

Can be used for loopsLoose or forgotten condition = blown stack

Page 55: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

HEADS OR TAILSPHP = heads

<?phpfunction head_sum($x) { return ($x == 1) ? $x : $x + head_sum($x - 1);}head_sum(10); // 55

Other languages have optimised tails

Page 56: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

HIGHER ORDERFUNCTIONS

Functions that have other functions asCall parametersReturn values

Can be used to form expressions

Page 57: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

HIGHER EXAMPLE<?php$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);function get_algorithm($rand_seed_fnc) { return (odd_even($rand_seed_fnc())) ? function($value) { return $value * $value; } : function($value) use ($rand_seed_fnc) { return ($value * $value / $rand_seed_fnc()) + 10; };}function odd_even($value) { return ($value % 2 === 0);}$rand_seed_fnc = function() { return rand(); };$results = array_map(get_algorithm($rand_seed_fnc), $data);

Page 58: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

PARTIAL FUNCTIONAPPLICATION

Essentially set defaults

<?php$first_char = function($string) { return substr($string, 0, 1);};

Works nicely with array_map()

<?phparray_map($first_char, array('foo','bar','baz'));// array('f','b','b')

Page 59: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

CURRYINGEach parameter becomes a functionMore flexible PFA

<?php$first_char = function($start) { return function($length) use ($start) { return function($string) use ($start, $length) { return substr($string, $start, $length); }; };};$a = $first_char(0);$b = $a(1);$b('foo'); // f$c = $a(2);$c('foo'); // fo

Page 60: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

MEMOIZATIONFunction local cache

<?phpfunction demo() { static $_c; if(is_null($_c)) { $_c = get_some_expensive_operation(); } return $_c;}

Handy in class methods too!

Page 61: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

WHEN TO USEFUNCTIONAL?

PracticeInnate understandingTuring complete methodology

Page 62: FUNCTIONAL PHPScala - (1 to 10).sum Haskell - sum[1..10] THE SCALE Pure - Haskell Middle ground - Scala and Clojure Dabbling - PHP and Python Hopeless - Brainfuck % FUNCTIONAL HISTORY

SO MUCH MORE...Function compositionTail recursionFunction objectsNew language featuresFunctorsApplicativesMonadsEvent driven programmingNull handling& more.