functional programming from first...
TRANSCRIPT
![Page 1: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/1.jpg)
Functional Programming
From First
Principles
![Page 2: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/2.jpg)
![Page 3: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/3.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/4.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/5.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/6.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/7.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/8.jpg)
Who Gets The
Blame?
![Page 9: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/9.jpg)
The Real World is Imperative
Look
Look again
![Page 10: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/10.jpg)
Still don’t believe me?! This monkey is now dead ….
May it rest in peace.
![Page 11: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/11.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/12.jpg)
(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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/13.jpg)
Consumer is not interested Interested in more values
Producer has run out of values
Initial handshake
Operational Details
![Page 14: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/14.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/15.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/16.jpg)
Producer
IObservable<T>
IEnumerable<T>
0, 1, 2, 3, 5, …
![Page 17: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/17.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/18.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/19.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/20.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/21.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/22.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/23.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/24.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/25.jpg)
fold :: (m, mmm,[m]m) t m m
Concrete type == BAD
![Page 26: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/26.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/27.jpg)
![Page 28: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/28.jpg)
Obsession with monads is a medical condition (thanks Pat Helland)
![Page 29: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/29.jpg)
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 Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/30.jpg)
Functional “Programming” is a tool for thought “Imperative” Programming is a tool for hacking
![Page 31: Functional Programming From First Principlesgotocon.com/dl/goto-chicago-2013/gotonightslides/FPfromFP.pdf · In Chinese philosophy, the concept of yin-yang (simplified Chinese: 阴阳;](https://reader034.vdocuments.us/reader034/viewer/2022043021/5f3cb36dff75673483665883/html5/thumbnails/31.jpg)
T StarAnise(){ …} Lazy<T> Cloves(){…} Task<T> Cinnamon() {….} IEnumerable<T> Pepper(){ …} IObservable<T> Fennel() {…}
You are the Chef ….