Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my...
-
Upload
jayden-roche -
Category
Documents
-
view
215 -
download
0
Transcript of Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my...
Disclaimer:
The opinions expressed herein are my own
personal opinions and do not represent my
employer's view in any way.
What is a XXX Language?
XXX = dynamicXXX = imperativeXXX = OO
What is a Functional Language
A language where functions are first-class citizens
EWD 1073
Easy likeSunday
morning
Dan MeyerWTF went
wrong?
Doing IO is a side-effect
Console.WriteLine(“ha”);Console.WriteLine(“ha”);!=Console.WriteLine(“ha”);
var x = Console.ReadLine();var y = x+x;!=var y = Console.ReadLine() + Console.ReadLine()
Doing IO is a side-effect
let date = DateTime.Now()in (date, date)( DateTime.Now(), DateTime.Now())
DateTime.Now is not a mathematical
function
If I cannot even do IO
Fundamentalist
Functional Programmin
gis just
academic nonsense
Don’t eatTheYellowSnow!
Lazy evaluation and side-effects
static bool LessThanThirty(int x){ Console.Write("{0}? Less than 30;",x); return x < 30;}static bool MoretHanTwenty(int x){ Console.Write("{0}? More than 20;",x); return x > 20;}
var q0 = from x in new[]{ 1, 25, 40, 5, 23 } where LessThanThirty(x) select x;
var q1 = from x in q0 where MoreThanTwenty(x) select x;
foreach (var r in q1) Console.WriteLine("[{0}];",r);
Order of side effects?
C#
let lessThanThirty(x:int)= begin Console.WriteLine ("{0} less than 30?", x); x < 30; end let moreThanTwenty(x:int)= begin Console.WriteLine ("{0} more than 20?", x); x > 20; end let q0 = seq { for x in [1; 25; 40; 5; 23] do if lessThanThirty x then yield x } let q1 = seq { for x in q0 do if moreThanTwenty x then yield x } for r in q1 do Console.WriteLine("> {0},", r)
F#Lazy
comprehensions
let lessThanThirty(x:int)= begin Console.WriteLine ("{0} less than 30?", x); x < 30; end let moreThanTwenty(x:int)= begin Console.WriteLine ("{0} more than 20?", x); x > 20; end let q0 = [ for x in [1; 25; 40; 5; 23] do if lessThanThirty x then yield x ] let q1 = [ for x in q0 do if moreThanTwenty x then yield x ] for r in q1 do Console.WriteLine("> {0},", r)
F#Eager
comprehensions
var xs = new[]{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
IEnumerable<int> q = null;
try{ q = from x in xs select 1/x;}catch{ q = new int[];}
foreach(var z in q) Console.WriteLine(z): // throws here
Exceptions
Func<string> GetContents = null;
using( var file = FileSystem.OpenTextFileReader(@"…")){ GetContents = () => file.ReadToEnd();}
// surprise! an exception Console.WriteLine(GetContents());
Disposing resources
var DelayedActions = new List<Func<int>>();var s = "";
for (var i = 4; i < 7; i++){ DelayedActions.Add(delegate(){ return i; });}
for (var k = 0; k < DelayedActions.Count; k++){ s += DelayedActions[k]();}
Console.WriteLine(s);
Variable Instantiation
Prints 777
var DelayedActions = new List<Func<int>>();var s = "";
for (var i = 4; i < 7; i++){ var j = i; DelayedActions.Add(delegate(){ return j; });}
for (var k = 0; k < DelayedActions.Count; k++){ s += DelayedActions[k]();}
Console.WriteLine(s);
Variable Instantiation
Prints 456
Prints 666
C#
JavaScript
var DelayedActions = new List<Func<int>>();var s = "";
var j;for (var i = 4; i < 7; i++){ j = i; DelayedActions.Add(delegate(){ return j; });}
for (var k = 0; k < DelayedActions.Count; k++){ s += DelayedActions[k]();}
Console.WriteLine(s);
Variable Instantiation
Prints 666
var o1 = new object();//58225482, for instanceConsole.WriteLine(o1.GetHashCode());
var o2 = new object();// 54267293, for instanceConsole.WriteLine(o2.GetHashCode());
Debug.Assert(o1 != 02);
Object creation
new_cell(X) -> spawn(fun() -> cell(X) end).cell(Value) -> receive {set, NewValue} -> cell(NewValue); {get, Pid} -> Pid!{return, Value}, cell(Value); {dispose} -> {} end.
set_cell(Cell, NewValue) -> Cell!{set, NewValue}.
get_cell(Cell) -> Cell!{get, self()}, receive {return, Value} -> Value end.dispose_cell(Cell) -> Cell!{dispose}.
Concurrency
Page 165:
There is a subtle error in on_exit and keep_alive … Write your code such that race conditions cannot happen.…Fortunately, the OTP libraries have code for building servers, supervisor trees, and so on.These libraries have been well tested and should not suffer from any race conditions.
GET …/person/age…GET …/clock/seconds…
few interestingfunctions areidempotent
*not* idempotent*not* pure
static T Identity<T>(this T me){ if(me.GetType() == typeof(Button)) throw new Exception();
var mini_me = me as string; if(mini_me != null) return “hello world”;
Console.WriteLine(me.ToString()); return Activator.CreateInstance<T>();}
“Dishonest” typesNot
parametric!
HOT Languages
To the rescue
lessThanThirty x = do { putStrLn $ (show x)++" less than 30?" ; return $ x < 30 } moreThanTwenty x = do { putStrLn $ (show x)++" more than 20?" ; return $ x > 20 } q0 = [ x | x <- [1, 25, 50, 5, 23 ] , lessThanThirty x ] q1 = [ x | x <- q0 , moreThanTwenty 20 ]
Couldn't match expected type `Bool' against inferred type `IO Bool' In a stmt of a list comprehension: lessThanThirty xIn the expression: [x | x <- [1, 25, 50, ....], lessThanThirty x]In the definition of `q0': q0 = [x | x <- [1, 25, ....], lessThanThirty x
Haskell
unsafePerformIO :: IO a -> a
unsafeCast :: a -> bunsafeCast x = unsafePerformIO $ do{ writeIORef castref x ; readIORef castref }
castref = unsafePerformIO $ do{ newIORef undefined }
Forget about effects? Forget it!
Cover upeffects
Remove all effects
(cannot make languagemore powerfulby removing features)
Don’t fight effects Embrace and extend
Mens sana in corpore sano
Mistake
DateTime.Now() DateTime
Type error!!!!!!!!!!!!!!!
Values vs Computation
How to turn something mutable into something immutable?
Time changes, the clock does not
…9:15 AM9:16 AM9:17 AM9:19 AM9:29 AM9:21 AM9:22 AM9:23 AM9:24 AM9:25 AM9:26 AM9:27 AM9:28 AM9:29 AM9:30 AM
…
It’s just a collection
All problems in computer science can be solved by
another level of indirection
D. Wheeler
Mathematics is always right
Multithreading STM<T>
Destructive updates IO<T>
Reflection Mirror<T>
Exceptions Throws<T>
Only one way to be pure,But many ways to be impure
The “M” word
Monads
M<A>
A computation that produces a value of type A with side-effects described by M
M IO Exception Animation Collection
IO
data IO a
putChar :: Char -> IO ()getChar :: IO Char
newIORef :: a -> IO (IORef a)readIORef :: IORef a -> IO awriteIORef :: IORef a -> a -> IO ()
forkIO :: IO a -> IO ThreadID
Side-effecting
computation that yields a value of type
a
CanNormal
ProgrammersUnderstand
FundamentalistFunctional
Programming?
LINQMonads are the secret sauce behind LINQ
IEnumerable<S> SelectMany<T,S>( IEnumerable<T> src, Func<T, IEnumerable<S>> selector)
Bind
Java
Throws clause
void Foo(string s) throws Exception
ExplicitEffects
FundamentalistFunctional Programming
Abstract from evaluation orderMake all effects explicit==>Compiler can freely rearrange codeRuntime can execute in code any order
Call-by-name, or call-by-value version?
Call To ActionBuy Graham Hutton’s book
Nudge and nag MS to produce a fundamentalist functional language
Buy BryanJohn & Don’sbook
Nudge and nag MS to produce a fundamentalist functional language
Thank You