KEMBAR78
Functional Programming You Already Know | PDF
Functional
Programming
You
Already
Know
@KevlinHenney
functional
programming
higher-order functions
recursion
statelessness
first-class functions
immutability
pure functions
unification
declarative
pattern matching
non-strict evaluation
idempotence
lists
mathematics
lambdas
currying
monads
Excel is the world's
most popular
functional language.
Simon Peyton Jones
To iterate is human,
to recurse divine.
L Peter Deutsch
int factorial(int n)
{
int result = 1;
while(n > 1)
result *= n--;
return result;
}
int factorial(int n)
{
if(n > 1)
return n * factorial(n - 1);
else
return 1;
}
int factorial(int n)
{
return
n > 1
? n * factorial(n - 1)
: 1;
}
n! =
1
(n – 1)!  n
if n = 0,
if n > 0.{
n! =
n
k = 1
k
seriesProduct(k, k, 1, n)
#include <stdio.h>
/* printd: print n in decimal */
void printd(int n)
{
if (n < 0) {
putchar('-');
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + '0');
}
/* grep: search for regexp in file */
int grep(char *regexp, FILE *f, char *name)
{
int n, nmatch;
char buf[BUFSIZ];
nmatch = 0;
while (fgets(buf, sizeof buf, f) != NULL) {
n = strlen(buf);
if (n > 0 && buf[n-1] == 'n')
buf[n-1] = '0';
if (match(regexp, buf)) {
nmatch++;
if (name != NULL)
printf("%s:", name);
printf("%sn", buf);
}
}
return nmatch;
}
/* matchhere: search for regexp at beginning of text */
int matchhere(char *regexp, char *text)
{
if (regexp[0] == '0')
return 1;
if (regexp[1] == '*')
return matchstar(regexp[0], regexp+2, text);
if (regexp[0] == '$' && regexp[1] == '0')
return *text == '0';
if (*text!='0' && (regexp[0]=='.' || regexp[0]==*text))
return matchhere(regexp+1, text+1);
return 0;
}
/* match: search for regexp anywhere in text */
int match(char *regexp, char *text)
{
if (regexp[0] == '^')
return matchhere(regexp+1, text);
do { /* must look even if string is empty */
if (matchhere(regexp, text))
return 1;
} while (*text++ != '0');
return 0;
}
/* matchstar: search for c*regexp at beginning of text */
int matchstar(int c, char *regexp, char *text)
{
do { /* a * matches zero or more instances */
if (matchhere(regexp, text))
return 1;
} while (*text != '0' && (*text++ == c || c == '.'));
return 0;
}
http://www.adampetersen.se/articles/fizzbuzz.htm
http://www.adampetersen.se/articles/fizzbuzz.htm
int atexit(void (*func)(void));
void qsort(
void *base,
size_t nmemb, size_t size,
int (*compar)(
const void *, const void *));
void (*signal(
int sig, void (*func)(int)))(int);
One of the most powerful mechanisms
for program structuring [...] is the block
and procedure concept.
A procedure which is capable of giving
rise to block instances which survive its
call will be known as a class; and the
instances will be known as objects of
that class.
A call of a class generates a new object
of that class.
Ole-Johan Dahl and C A R Hoare
"Hierarchical Program Structures"
public class HeatingSystem {
public void turnOn() 
public void turnOff() 

}
public class Timer {
public Timer(TimeOfDay toExpire, Runnable toDo) 
public void run() 
public void cancel() 

}
Timer on =
new Timer(
timeToTurnOn,
new Runnable() {
public void run() {
heatingSystem.turnOn();
}
});
Timer off =
new Timer(
timeToTurnOff,
new Runnable() {
public void run() {
heatingSystem.turnOff();
}
});
class Timer
{
public:
Timer(TimeOfDay toExpire, function<void()> toDo);
void run();
void cancel();
...
};
Timer on(
timeOn,
bind(&HeatingSystem::turnOn, &heatingSystem));
Timer off(
timeOff,
bind(&HeatingSystem::turnOff, &heatingSystem));
public class Timer
{
public Timer(TimeOfDay toExpire, Action toDo) ...
public void Run() ...
public void Cancel() ...
...
}
Timer on = new Timer(timeOn, heatingSystem.TurnOn);
Timer off = new Timer(timeOff, heatingSystem.TurnOff);
Timer on =
new Timer(timeOn, () => heatingSystem.TurnOn());
Timer off =
new Timer(timeOff, () => heatingSystem.TurnOff());
William Cook, "On Understanding Data Abstraction, Revisited"
newStack =
  (let items = ref() 
{
isEmpty =   #items = 0,
depth =   #items,
push =  x  items := xˆitemsy  y  0...#items,
top =   items0
})
var newStack = function() {
var items = []
return {
isEmpty: function() {
return items.length === 0
},
depth: function() {
return items.length
},
push: function(newTop) {
items = items.unshift(newTop)
},
top: function() {
return items[0]
}
}
}
intension, n. (Logic)
 the set of characteristics or properties by which
the referent or referents of a given expression is
determined; the sense of an expression that
determines its reference in every possible world,
as opposed to its actual reference. For example,
the intension of prime number may be having
non-trivial integral factors, whereas its extension
would be the set {2, 3, 5, 7, ...}.
E J Borowski and J M Borwein
Dictionary of Mathematics
A list comprehension is a syntactic
construct available in some programming
languages for creating a list based on
existing lists. It follows the form of the
mathematical set-builder notation (set
comprehension) as distinct from the use of
map and filter functions.
http://en.wikipedia.org/wiki/List_comprehension
{ 2  x | x  , x > 0 }
(2 * x for x in count() if x > 0)
{ x | x  , x > 0  x mod 2 = 0 }
(x for x in count() if x > 0 and x % 2 == 0)
Concatenative programming is so called
because it uses function composition instead of
function application—a non-concatenative
language is thus called applicative.
Jon Purdy
http://evincarofautumn.blogspot.in/2012/02/
why-concatenative-programming-matters.html
f(g(h(x)))
(f ○ g ○ h)(x)
x h g f
h | g | f
This is the basic reason Unix pipes are so
powerful: they form a rudimentary string-based
concatenative programming language.
Jon Purdy
http://evincarofautumn.blogspot.in/2012/02/
why-concatenative-programming-matters.html
find . -name "*.java" |
sed 's/.*///' |
sort |
uniq -c |
grep -v "^ *1 " |
sort -r
Heinz Kabutz
"Know Your IDE"
97 Things Every Programmer Should Know
Concurrency
Concurrency
Threads
Concurrency
Threads
Locks
Some people, when confronted with a
problem, think, "I know, I'll use threads,"
and then two they hav erpoblesms.
Ned Batchelder
https://twitter.com/nedbat/status/194873829825327104
public final class Date implements ... {
...
public int getYear() ...
public int getMonth() ...
public int getDayInMonth() ...
public void setYear(int newYear) ...
public void setMonth(int newMonth) ...
public void setDayInMonth(int newDayInMonth) ...
...
}
public final class Date implements ... {
...
public int getYear() ...
public int getMonth() ...
public int getWeekInYear() ...
public int getDayInYear() ...
public int getDayInMonth() ...
public int getDayInWeek() ...
public void setYear(int newYear) ...
public void setMonth(int newMonth) ...
public void setWeekInYear(int newWeek) ...
public void setDayInYear(int newDayInYear) ...
public void setDayInMonth(int newDayInMonth) ...
public void setDayInWeek(int newDayInWeek) ...
...
}
public final class Date implements ... {
...
public int getYear() ...
public int getMonth() ...
public int getWeekInYear() ...
public int getDayInYear() ...
public int getDayInMonth() ...
public int getDayInWeek() ...
...
}
When it is not
necessary to
change, it is
necessary not to
change.
Lucius Cary
public final class Date implements ... {
...
public int getYear() ...
public int getMonth() ...
public int getWeekInYear() ...
public int getDayInYear() ...
public int getDayInMonth() ...
public int getDayInWeek() ...
...
}
public final class Date implements ... {
...
public int year() ...
public int month() ...
public int weekInYear() ...
public int dayInYear() ...
public int dayInMonth() ...
public int dayInWeek() ...
...
}
Immutable Value
Define a value object type
whose instances are immutable.
Copied Value
Define a value object type
whose instances are copyable.
Instead of using threads and shared memory
as our programming model, we can use
processes and message passing. Process here
just means a protected independent state
with executing code, not necessarily an
operating system process.
Languages such as Erlang (and occam before
it) have shown that processes are a very
successful mechanism for programming
concurrent and parallel systems. Such
systems do not have all the synchronization
stresses that shared-memory, multithreaded
systems have.
Russel Winder
"Message Passing Leads to Better Scalability in Parallel Systems"
OOP to me means only
messaging, local retention
and protection and hiding of
state-process, and extreme
late-binding of all things.
Alan Kay
The makefile language is similar to
declarative programming. This class
of language, in which necessary end
conditions are described but the
order in which actions are to be
taken is not important, is sometimes
confusing to programmers used to
imperative programming.
http://en.wikipedia.org/wiki/Make_(software)
SELECT time, speaker, title
FROM Sessions
WHERE
date = '2013-06-13' AND
time >= '11:40:00'
ORDER BY time
try {
Integer.parseInt(time.substring(0, 2));
}
catch (Exception x) {
return false;
}
if (Integer.parseInt(time.substring(0, 2)) > 12) {
return false;
}
...
if (!time.substring(9, 11).equals("AM") &
!time.substring(9, 11).equals("PM")) {
return false;
}
Burk Hufnagel
"Put the Mouse Down and Step Away from the Keyboard"
97 Things Every Programmer Should Know
public static boolean validateTime(String time) {
return time.matches("(0[1-9]|1[0-2]):[0-5][0-9]:[0-5][0-9] ([AP]M)");
}
Burk Hufnagel
"Put the Mouse Down and Step Away from the Keyboard"
97 Things Every Programmer Should Know
$0 % 3 == 0 { printf "Fizz" }
$0 % 5 == 0 { printf "Buzz" }
$0 % 3 != 0 && $0 % 5 != 0 { printf $0 }
{ printf "n" }
echo {1..100} | tr ' ' 'n' | awk '
$0 % 3 == 0 { printf "Fizz" }
$0 % 5 == 0 { printf "Buzz" }
$0 % 3 != 0 && $0 % 5 != 0 { printf $0 }
{ printf "n" }
'
echo {1..100} | tr ' ' 'n' | awk '
$0 % 3 == 0 { printf "Fizz" }
$0 % 5 == 0 { printf "Buzz" }
$0 % 3 != 0 && $0 % 5 != 0 { printf $0 }
{ printf "n" }
' | diff - expected && echo Pass
/^1?$|^(11+?)1+$/
http://www.noulakaz.net/weblog/2007/03/18/
a-regular-expression-to-check-for-prime-numbers/
def is_prime(n)
("1" * n) !~ /^1?$|^(11+?)1+$/
end
http://xkcd.com/224/
We lost the documentation on quantum mechanics.
You'll have to decode the regexes yourself.

Functional Programming You Already Know

  • 1.
  • 6.
    functional programming higher-order functions recursion statelessness first-class functions immutability purefunctions unification declarative pattern matching non-strict evaluation idempotence lists mathematics lambdas currying monads
  • 7.
    Excel is theworld's most popular functional language. Simon Peyton Jones
  • 8.
    To iterate ishuman, to recurse divine. L Peter Deutsch
  • 9.
    int factorial(int n) { intresult = 1; while(n > 1) result *= n--; return result; }
  • 10.
    int factorial(int n) { if(n> 1) return n * factorial(n - 1); else return 1; }
  • 11.
    int factorial(int n) { return n> 1 ? n * factorial(n - 1) : 1; }
  • 12.
    n! = 1 (n –1)!  n if n = 0, if n > 0.{
  • 13.
    n! = n k =1 k
  • 14.
  • 17.
    #include <stdio.h> /* printd:print n in decimal */ void printd(int n) { if (n < 0) { putchar('-'); n = -n; } if (n / 10) printd(n / 10); putchar(n % 10 + '0'); }
  • 19.
    /* grep: searchfor regexp in file */ int grep(char *regexp, FILE *f, char *name) { int n, nmatch; char buf[BUFSIZ]; nmatch = 0; while (fgets(buf, sizeof buf, f) != NULL) { n = strlen(buf); if (n > 0 && buf[n-1] == 'n') buf[n-1] = '0'; if (match(regexp, buf)) { nmatch++; if (name != NULL) printf("%s:", name); printf("%sn", buf); } } return nmatch; } /* matchhere: search for regexp at beginning of text */ int matchhere(char *regexp, char *text) { if (regexp[0] == '0') return 1; if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text); if (regexp[0] == '$' && regexp[1] == '0') return *text == '0'; if (*text!='0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1); return 0; } /* match: search for regexp anywhere in text */ int match(char *regexp, char *text) { if (regexp[0] == '^') return matchhere(regexp+1, text); do { /* must look even if string is empty */ if (matchhere(regexp, text)) return 1; } while (*text++ != '0'); return 0; } /* matchstar: search for c*regexp at beginning of text */ int matchstar(int c, char *regexp, char *text) { do { /* a * matches zero or more instances */ if (matchhere(regexp, text)) return 1; } while (*text != '0' && (*text++ == c || c == '.')); return 0; }
  • 21.
  • 22.
  • 23.
  • 24.
    void qsort( void *base, size_tnmemb, size_t size, int (*compar)( const void *, const void *));
  • 25.
    void (*signal( int sig,void (*func)(int)))(int);
  • 27.
    One of themost powerful mechanisms for program structuring [...] is the block and procedure concept. A procedure which is capable of giving rise to block instances which survive its call will be known as a class; and the instances will be known as objects of that class. A call of a class generates a new object of that class. Ole-Johan Dahl and C A R Hoare "Hierarchical Program Structures"
  • 28.
    public class HeatingSystem{ public void turnOn()  public void turnOff()   } public class Timer { public Timer(TimeOfDay toExpire, Runnable toDo)  public void run()  public void cancel()   }
  • 29.
    Timer on = newTimer( timeToTurnOn, new Runnable() { public void run() { heatingSystem.turnOn(); } }); Timer off = new Timer( timeToTurnOff, new Runnable() { public void run() { heatingSystem.turnOff(); } });
  • 30.
    class Timer { public: Timer(TimeOfDay toExpire,function<void()> toDo); void run(); void cancel(); ... };
  • 31.
    Timer on( timeOn, bind(&HeatingSystem::turnOn, &heatingSystem)); Timeroff( timeOff, bind(&HeatingSystem::turnOff, &heatingSystem));
  • 32.
    public class Timer { publicTimer(TimeOfDay toExpire, Action toDo) ... public void Run() ... public void Cancel() ... ... }
  • 33.
    Timer on =new Timer(timeOn, heatingSystem.TurnOn); Timer off = new Timer(timeOff, heatingSystem.TurnOff);
  • 34.
    Timer on = newTimer(timeOn, () => heatingSystem.TurnOn()); Timer off = new Timer(timeOff, () => heatingSystem.TurnOff());
  • 35.
    William Cook, "OnUnderstanding Data Abstraction, Revisited"
  • 36.
    newStack =  (let items = ref()  { isEmpty =   #items = 0, depth =   #items, push =  x  items := xˆitemsy  y  0...#items, top =   items0 })
  • 37.
    var newStack =function() { var items = [] return { isEmpty: function() { return items.length === 0 }, depth: function() { return items.length }, push: function(newTop) { items = items.unshift(newTop) }, top: function() { return items[0] } } }
  • 38.
    intension, n. (Logic) the set of characteristics or properties by which the referent or referents of a given expression is determined; the sense of an expression that determines its reference in every possible world, as opposed to its actual reference. For example, the intension of prime number may be having non-trivial integral factors, whereas its extension would be the set {2, 3, 5, 7, ...}. E J Borowski and J M Borwein Dictionary of Mathematics
  • 39.
    A list comprehensionis a syntactic construct available in some programming languages for creating a list based on existing lists. It follows the form of the mathematical set-builder notation (set comprehension) as distinct from the use of map and filter functions. http://en.wikipedia.org/wiki/List_comprehension
  • 40.
    { 2 x | x  , x > 0 }
  • 41.
    (2 * xfor x in count() if x > 0)
  • 42.
    { x |x  , x > 0  x mod 2 = 0 }
  • 43.
    (x for xin count() if x > 0 and x % 2 == 0)
  • 45.
    Concatenative programming isso called because it uses function composition instead of function application—a non-concatenative language is thus called applicative. Jon Purdy http://evincarofautumn.blogspot.in/2012/02/ why-concatenative-programming-matters.html
  • 46.
  • 47.
    (f ○ g○ h)(x)
  • 48.
  • 49.
    h | g| f
  • 50.
    This is thebasic reason Unix pipes are so powerful: they form a rudimentary string-based concatenative programming language. Jon Purdy http://evincarofautumn.blogspot.in/2012/02/ why-concatenative-programming-matters.html
  • 52.
    find . -name"*.java" | sed 's/.*///' | sort | uniq -c | grep -v "^ *1 " | sort -r Heinz Kabutz "Know Your IDE" 97 Things Every Programmer Should Know
  • 53.
  • 54.
  • 55.
  • 56.
    Some people, whenconfronted with a problem, think, "I know, I'll use threads," and then two they hav erpoblesms. Ned Batchelder https://twitter.com/nedbat/status/194873829825327104
  • 57.
    public final classDate implements ... { ... public int getYear() ... public int getMonth() ... public int getDayInMonth() ... public void setYear(int newYear) ... public void setMonth(int newMonth) ... public void setDayInMonth(int newDayInMonth) ... ... }
  • 58.
    public final classDate implements ... { ... public int getYear() ... public int getMonth() ... public int getWeekInYear() ... public int getDayInYear() ... public int getDayInMonth() ... public int getDayInWeek() ... public void setYear(int newYear) ... public void setMonth(int newMonth) ... public void setWeekInYear(int newWeek) ... public void setDayInYear(int newDayInYear) ... public void setDayInMonth(int newDayInMonth) ... public void setDayInWeek(int newDayInWeek) ... ... }
  • 59.
    public final classDate implements ... { ... public int getYear() ... public int getMonth() ... public int getWeekInYear() ... public int getDayInYear() ... public int getDayInMonth() ... public int getDayInWeek() ... ... }
  • 60.
    When it isnot necessary to change, it is necessary not to change. Lucius Cary
  • 61.
    public final classDate implements ... { ... public int getYear() ... public int getMonth() ... public int getWeekInYear() ... public int getDayInYear() ... public int getDayInMonth() ... public int getDayInWeek() ... ... }
  • 62.
    public final classDate implements ... { ... public int year() ... public int month() ... public int weekInYear() ... public int dayInYear() ... public int dayInMonth() ... public int dayInWeek() ... ... }
  • 63.
    Immutable Value Define avalue object type whose instances are immutable. Copied Value Define a value object type whose instances are copyable.
  • 65.
    Instead of usingthreads and shared memory as our programming model, we can use processes and message passing. Process here just means a protected independent state with executing code, not necessarily an operating system process. Languages such as Erlang (and occam before it) have shown that processes are a very successful mechanism for programming concurrent and parallel systems. Such systems do not have all the synchronization stresses that shared-memory, multithreaded systems have. Russel Winder "Message Passing Leads to Better Scalability in Parallel Systems"
  • 67.
    OOP to memeans only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. Alan Kay
  • 68.
    The makefile languageis similar to declarative programming. This class of language, in which necessary end conditions are described but the order in which actions are to be taken is not important, is sometimes confusing to programmers used to imperative programming. http://en.wikipedia.org/wiki/Make_(software)
  • 69.
    SELECT time, speaker,title FROM Sessions WHERE date = '2013-06-13' AND time >= '11:40:00' ORDER BY time
  • 70.
    try { Integer.parseInt(time.substring(0, 2)); } catch(Exception x) { return false; } if (Integer.parseInt(time.substring(0, 2)) > 12) { return false; } ... if (!time.substring(9, 11).equals("AM") & !time.substring(9, 11).equals("PM")) { return false; } Burk Hufnagel "Put the Mouse Down and Step Away from the Keyboard" 97 Things Every Programmer Should Know
  • 71.
    public static booleanvalidateTime(String time) { return time.matches("(0[1-9]|1[0-2]):[0-5][0-9]:[0-5][0-9] ([AP]M)"); } Burk Hufnagel "Put the Mouse Down and Step Away from the Keyboard" 97 Things Every Programmer Should Know
  • 72.
    $0 % 3== 0 { printf "Fizz" } $0 % 5 == 0 { printf "Buzz" } $0 % 3 != 0 && $0 % 5 != 0 { printf $0 } { printf "n" }
  • 73.
    echo {1..100} |tr ' ' 'n' | awk ' $0 % 3 == 0 { printf "Fizz" } $0 % 5 == 0 { printf "Buzz" } $0 % 3 != 0 && $0 % 5 != 0 { printf $0 } { printf "n" } '
  • 74.
    echo {1..100} |tr ' ' 'n' | awk ' $0 % 3 == 0 { printf "Fizz" } $0 % 5 == 0 { printf "Buzz" } $0 % 3 != 0 && $0 % 5 != 0 { printf $0 } { printf "n" } ' | diff - expected && echo Pass
  • 75.
  • 76.
    http://xkcd.com/224/ We lost thedocumentation on quantum mechanics. You'll have to decode the regexes yourself.