Successfully reported this slideshow.
Upcoming SlideShare
×

# Effecting Pure Change - How anything ever gets done in functional programming languages - Anupam Jain (S&P Global)

67 views

Published on

Newcomers to functional programming are often mystified when they encounter pure functions and immutable data structures. A mathematical function which always produces the same output for the same input is so inflexible as to be almost useless! And surely how can you even represent even the simplest of dynamic program state without variables to store it in, to say nothing of fancy user interfaces, and complex input output.

This talk will present an overview of the various techniques that are used by functional programming languages to tackle state and external "effects" which are needed for any real world program. It will cover a large landscape ranging from Monads, to Algebraic Effects, to Functional Reactive Programming. And it will show how functional programming can be as *useful* for real world programs, as it is *beautiful*.

Published in: Technology
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

• Be the first to like this

### Effecting Pure Change - How anything ever gets done in functional programming languages - Anupam Jain (S&P Global)

1. 1. EFFECTING PURE CHANGE HOW ANYTHING EVER GETS DONE IN FP ANUPAM JAIN
2. 2. 2 Hello!
3. 3. 3 ❑ MEETUP: https://www.meetup.com/DelhiNCR-Haskell-And- Functional-Programming-Languages-Group ❑ TELEGRAM: https://t.me/fpncr ❑ GITHUB: https://github.com/fpncr ❑ SLACK: https://functionalprogramming.slack.com #FPNCR FPNCR
4. 4. 4 Effects
5. 5. 5 ❑ Programming with Mathematical Functions. ❑ A Function has Input and Output. ❑ Referentially Transparent ❑ A complete Program is just a function! Functional Programming
6. 6. 6 ❑ No Global State ❑ No Assignments ❑ No Statements ❑ No Input-Output Referential Transparency
7. 7. 7 ❑ Easier to Reason About ❑ Easier to Optimize ❑ Easier to Parallelize ❑ Easier to Test ❑ ??? Why?
8. 8. 8 SideEffects!!
9. 9. 9 What Happens If we Ignore the Danger
10. 10. 10 write :: String -> () read :: () -> String What could go wrong
11. 11. 11 write "Do you want a pizza?" if (read() == "Yes") orderPizza() write "Should I launch missiles?" if (read() == "Yes") launchMissiles() What could go wrong PSEUDO-CODE
12. 12. 12 write "Do you want a pizza?" if (read() == "Yes") orderPizza() write "Should I launch missiles?" if (read() == "Yes") launchMissiles() What could go wrong May be optimized away
13. 13. 13 write "Do you want a pizza?" if (read() == "Yes") orderPizza() write "Should I launch missiles?" if (read() == "Yes") launchMissiles() What could go wrong May reuse value from previous read()
14. 14. 14 OCAML let val ha = (print "ha") in ha; ha end HASKELL let ha = putStr “ha” in ha >> ha Referential Transparency is Vital ha haha
15. 15. 15 Taming Side Effects
16. 16. 16 ❑ Separate “Effects” from “Values” (Hint: Strong Types are great for this) ❑ Effects are forever. No way to recover a “pure” Value. ❑ As much as possible, tag the flavor of side effects. “Print” cannot launch nukes. Contain. Not Prohibit.
17. 17. 17 Effectful Logic Pure Logic Outside World
18. 18. 18 ❑ React – Functional Views ❑ The Elm Architecture ❑ Functional Reactive Programming ❑ Monads and Algebraic Effects Examples
19. 19. 19 render() { let n = this.state.count return <button onClick = {setState({count:n+1})}>{n}</button> } React – Functional Views
20. 20. 20 view address model = button [onClick address Increment] [text (toString model)] update action model = case action of Increment -> model + 1 The Elm Architecture
21. 21. 21 ❑ Interface between things that are static and those that vary ❑ Forms a graph of relationships between varying things ❑ The program creates the graph, and then lets things run. Akin to cellular automata. Functional Reactive Programming
22. 22. 22 ❑ Event a – e.g. Button Clicks ❑ Behaviour a – e.g. System Time ❑ toBehaviour :: Event a -> Behaviour a ❑ mergeEvents :: Event a -> Event a -> Event a ❑ zipBehaviour :: (a -> b -> c) -> Behaviour a -> Behaviour b -> Behaviour c FRP Primitives
23. 23. 23 ❑ Event a – e.g. Button Clicks ❑ Behaviour a – e.g. System Time ❑ hold :: Event a -> Behaviour a ❑ sample :: Behaviour a -> Event b -> Event (a,b) ❑ merge :: Event a -> Event a -> Event a ❑ zip :: Behaviour a -> Behaviour b -> Behaviour (a,b) FRP Primitives
24. 24. 24 ❑ text :: Behaviour String -> IO () ❑ button :: Event () ❑ gui = do clicks <- button text hold “Not Clicked” (map (_ -> “Clicked!”) clicks) FRP GUIs
26. 26. 26 ❑ Tagged values ❑ Provide explicit control over sequencing Monads IO String
27. 27. 27 ❑ Values can be evaluated in any order (or left unevaluated). ❑ Effects need explicit control over sequencing and sharing. ❑ The only way sequencing is possible in FP is through nested functions. i.e. Callbacks. Controlling Sequencing write "Hello" (() -> write "World")
28. 28. 28 write "Do you want a pizza?" ( () -> read ( ans -> if (ans == "Yes") orderPizza ( () -> write "Should I launch missiles?" ( () -> read ( ans -> if (ans == "Yes") launchNukes () ) ) ) ) ) Continuation Passing Style
29. 29. 29 x <- foo … Sprinkle Some Syntactic Sugar foo (x -> …)
30. 30. 30 () <- write "Do you want a pizza?“ ans <- read if(ans == "Yes") () <- orderPizza () <- write "Should I launch missiles?“ ans <- read if (ans == "Yes") () <- launchNukes Sprinkle Some Syntactic Sugar write "Do you want a pizza?" (() -> read (ans -> if (ans == "Yes") orderPizza (() -> write "Should I launch missiles?" (() -> read (ans -> if (ans == "Yes") launchNukes () ) ) ) ) )
31. 31. 31 do write "Do you want a pizza?“ ans <- read if(ans == "Yes") orderPizza write "Should I launch missiles?“ ans <- read if (ans == "Yes") launchNukes Do notation
32. 32. 32 ❑ Callbacks are generally associated with Asynchronous code ❑ Do notation avoids “Callback Hell” Asynchronous Computations are Effects ajax GET “google.com" (response -> …)
33. 33. 33 do post <- ajax GET “/post/1“ map post.comments (cid -> do comment <- ajax GET “/comments/{cid}“ … ) Avoiding Callback Hell ajax GET “/post/1" (post -> map post.comments (cid -> ajax GET “/comments/{cid}" (comment -> … ) ) )
34. 34. 34 if(ans == "Yes") orderPizza else ??? Where is the Else block?
35. 35. 35 if(ans == "Yes") orderPizza else return () Where is the Else block?
36. 36. 36 Type: IO a Bind: IO a -> (a -> IO b) -> IO b Return: a -> IO a The Monad
37. 37. 37 ❑ Reader ❑ Logger ❑ State ❑ Exceptions ❑ Random ❑ … Bring Your Own Monad