functional programming from first principles › dl › goto-chicago-2013 › gotonightslides ›...

31
Functional Programming From First Principles

Upload: others

Post on 06-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Functional Programming

From First

Principles

Page 2: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified
Page 3: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

foreach(var i in new[]{0,1,2,3,4}) { Console.WriteLine(i); }

Where is the loop variable declared?

var i_ = default(int); foreach(var i in new[]{0,1,2,3,4}) { i_ = i; Console.WriteLine(i_); }

foreach(var i in new[]{0,1,2,3,4}) { var _i = i ; Console.WriteLine(_i); }

Outside?

Inside?

Page 4: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

foreach(var i in new[]{0,1,2,3,4}) { Console.WriteLine(i); }

Where is the loop variable declared?

var i_ = default(int); foreach(var i in new[]{0,1,2,3,4}) { i_ = i; Console.WriteLine(i_); }

foreach(var i in new[]{0,1,2,3,4}) { var _i = i ; Console.WriteLine(_i); }

0 1 2 3 4

0 1 2 3 4

0 1 2 3 4

Who cares?

Page 5: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

var fis = new List<Action>(); foreach(var i in new[]{0,1,2,3,4}) { fis.Add(delegate{ Console.WriteLine(i);}); } foreach(var fi in fis) fi(); var fis = new List<Action>(); var i_ = default(int); foreach(var i in new[]{0,1,2,3,4}) { i_ = i; fjs.Add(delegate{ Console.WriteLine(i_);}); } foreach(var fi in fis) fi(); var fis = new List<Action>(); foreach(var i in new[]{0,1,2,3,4}) { var _i = i; fis.Add(delegate{ Console.WriteLine(_i);}); } foreach(var fi in fis) fi();

Let’s  capture  it   and see what happens

Outside?

Inside?

Page 6: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

var fis = new List<Action>(); foreach(var i in new[]{0,1,2,3,4}) { fis.Add(delegate{ Console.WriteLine(i);}); } foreach(var fi in fis) fi(); var fis = new List<Action>(); var i_ = default(int); foreach(var i in new[]{0,1,2,3,4}) { i_ = i; fjs.Add(delegate{ Console.WriteLine(i_);}); } foreach(var fi in fis) fi(); var fis = new List<Action>(); foreach(var i in new[]{0,1,2,3,4}) { var _i = i; fis.Add(delegate{ Console.WriteLine(_i);}); } foreach(var fi in fis) fi();

0 1 2 3 4

4 4 4 4 4

4 4 4 4 4

C#4

0 1 2 3 4

C#5

Page 7: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

var fis = new List<Action>(); for(var i = 0; i < 5; i++) { fis.Add(delegate{ Console.WriteLine(i);}); } foreach(var fi in fis) fi(); var fis = new List<Action>(); var i_ = default(int); for(i_ = 0; i_ < 5; i_++) { fjs.Add(delegate{ Console.WriteLine(i_);}); } foreach(var fi in fis) fi(); var fis = new List<Action>(); for(var i = 0; i < 5; i++) { var _i = i; fls.Add(delegate{ Console.WriteLine(_i);}); } foreach(var fi in fis) fi();

0 1 2 3 4

5 5 5 5 5

5 5 5 5 5

Page 8: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Who Gets The

Blame?

Page 9: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

The Real World is Imperative

Look

Look again

Page 10: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Still  don’t  believe  me?! This  monkey  is  now  dead  ….

May it rest in peace.

Page 11: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

var fis = new List<Action>(); foreach(var i in new[]{0,1,2,3,4}) { fis.Add(delegate{ Console.WriteLine(i);}); } foreach(var fi in fis) fi();

var fis = new List<Action>(); foreach(var i in new[]{0,1,2,3,4}) { fis.Add(delegate{ Console.WriteLine(i);}); } foreach(var fi in fis) fi(); innocent

innocent

guilty

Page 12: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

(0) read value mutable variable of type T (1) If you want to see next value call this Func<T> (i.e. ()T) to get it. (2) Here is an Action<T> (i.e. T()), notify me when the next value is available.

producer consumer

Acknowledge the presence of side-effects

0,  1,  2,  3,  5,  …

How to communicate a stream of values between producer and consumer?

Page 13: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Consumer is not interested Interested in more values

Producer has run out of values

Initial handshake

Operational Details

Page 14: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Pull-based protocol (consumer asks for values)

interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } interface IEnumerable<T> : IDisposable { bool MoveNext(); T Current { get; } } interface IDisposable { void Dispose(); }

Call when want next value ()T+()+Exception;

I  won’t  bother  you  anymore, you may forget about me.

Initial handshake

Page 15: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Push-based protocol (consumer gets notified of values)

interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); } interface IObserver<T> { void OnNext(T value); void OnCompleted(); void OnError(Exception error); } interface IDisposable { void Dispose(); }

Notify when next value available T+()+Exception();

I  won’t  bother  you  anymore, you may forget about me.

Initial handshake

Page 16: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Producer

IObservable<T>

IEnumerable<T>

0,  1,  2,  3,  5,  …

Page 17: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

What if precisely one value?

class Lazy<T> { T Value { get; } }

class Task<T> { Task<S> ContinueWith<S> (Func<Task<T>,S>  continuation){  …  } T Result{ get; } }

Pull

Push

(Note concrete classes, not interfaces )

Page 18: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

One Many

Pull T/Lazy<T> IEnumerable<T>

Push Task<T> IObservable<T>

五香粉

The formulae are based on the

Chinese philosophy of balancing the yin

and yang in food. [Wikipedia]

Page 19: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳; traditional Chinese: 陰陽; pinyin: yīnyáng), which is often referred to in the West as "yin and yang", literally meaning "shadow and light", is used to describe how polar opposites or seemingly contrary forces are interconnected and interdependent in the natural world, and how they give rise to each other in turn in relation to each other. [Wikipedia]

Page 20: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Interface versus Implementation

IEnumerable<T>

T[] List<T> HashTable<K,T> …

interface concrete class

Essence Implementation details

Make all assumptions explicit

Page 21: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

In most OO languages the distinction is blurred

interface IA {} abstract class A {} static class B {} sealed class C {} class D { protected private virtual partial Foo Bar() {  … this … } }

Page 22: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

foldr :: (a b b) b ([a] b) foldr :: Foldable t (a b b) b (t a b) find :: Foldable t (a Bool) t a Maybe a

Concrete type == BAD

Qualified type == GOOD

Page 23: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

class Foldable t where { fold :: Monoid m t m m foldMap :: Monoid m (a m) t a m foldr :: (a b b) b t a b foldl :: (a b a) a t b a } class Monoid m where { mempty :: m mappend :: m m m mconcat :: [m] m }

Page 24: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

fold :: Monoid m t m m

fold :: (m, mmm,[m]m) t m m

Roughly a shorthand for

All dependencies are explicit No  “injection” Dreyfus Novice

Implicit parameter Controlled  “injection” Competent

Page 25: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

fold :: (m, mmm,[m]m) t m m

Concrete type == BAD

Page 26: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Interface-based programming to the extreme: Category Theory

A B C f g

id

f;g

Objects, Morphisms and Composition Dreyfus proficient

Page 27: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified
Page 28: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Obsession with monads is a medical condition (thanks Pat Helland)

Page 29: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

IEnumerable<T> () (()T)

IObservable<T> (T()) ()

IEnumerator<T>

Iobserver<T>

Monad CoMonad Dual? Does it really matter  … Dreyfus expert

Page 30: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

Functional  “Programming”  is     a tool for thought “Imperative”  Programming  is a tool for hacking

Page 31: Functional Programming From First Principles › dl › goto-chicago-2013 › gotonightslides › ... · 2012-09-10 · In Chinese philosophy, the concept of yin-yang (simplified

T StarAnise(){  …} Lazy<T>  Cloves(){…} Task<T>  Cinnamon()  {….} IEnumerable<T>  Pepper(){  …} IObservable<T>  Fennel()  {…}

You  are  the  Chef  ….