A presentation at Øredev 2019 in in Malmö, Sweden by Brooklyn Zelenka
THE UNREASONABLE EFFECTIVENESS OF MONADS 🔥 🚀 A U T O M A T I O N , S T R U C T U R E , & P U R E LY F U N C T I O N A L E F F E C T S ⚙ ✨
Simplicity is prerequisite for reliability 🔑 EDSGER DIJKSTRA
THE UNREASONABLE EFFECTIVENESS OF MONADS B R O O K LY N Z E L E N K A , @ e x p e d e
THE UNREASONABLE EFFECTIVENESS OF MONADS B R O O K LY N Z E L E N K A , @ e x p e d e • Cofounder/CTO at Fission • https://fission.codes • PLT & VM enthusiast • Previously an Ethereum Core Dev • Primary author of Witchcraft Suite • Used to teach Elixir professionally • Now with a Haskell team 😉
THE UNREASONABLE EFFECTIVENESS OF MONADS S A L E S P I TC H
THE UNREASONABLE EFFECTIVENESS OF MONADS S A L E S P I TC H
250 THE UNREASONABLE EFFECTIVENESS OF MONADS E D U C AT I O N I N V E S T M E N T V S C O M P L E X I T Y Structured Unconstrained
THE UNREASONABLE EFFECTIVENESS OF MONADS E D U C AT I O N I N V E S T M E N T V S C O M P L E X I T Y 1000 750 500 Unconstrained 250 Structured
THE UNREASONABLE EFFECTIVENESS OF MONADS E F F E C T- F O C U S E D
THE UNREASONABLE EFFECTIVENESS OF MONADS E F F E C T- F O C U S E D • Monads are extremely well defined
THE UNREASONABLE EFFECTIVENESS OF MONADS E F F E C T- F O C U S E D • Monads are extremely well defined • Steer away from the math 🚫
THE UNREASONABLE EFFECTIVENESS OF MONADS E F F E C T- F O C U S E D • Monads are extremely well defined • Steer away from the math • Many uses, but the main practical one is effects 🚫
THE UNREASONABLE EFFECTIVENESS OF MONADS TA B L E O F C O N T E N T S
THE UNREASONABLE EFFECTIVENESS OF MONADS TA B L E O F C O N T E N T S • Some seemingly unrelated — but already familiar — concepts • Structured abstraction • Technical prerequisites • The essence of the monadic style • Common examples
STRUCTURED ABSTRACTION
STRUCTURED ABSTRACTION 🧱
STRUCTURED ABSTRACTION structure / ˈstrʌk tʃər / 1. A mode of building, construction, or organization; arrangement of parts, elements, or constituents e.g. a pyramidal structure. 🗼
STRUCTURED ABSTRACTION abstraction / æbˈstræk ʃən / 1. Something that concentrates in itself the essential qualities of anything more extensive or more general, or of several things; its essence. ⚗
STRUCTURED ABSTRACTION TRADE-OFFS • “GOTOs considered harmful” • Exchange control for understanding Libraries Applications
STRUCTURED ABSTRACTION TRADE-OFFS • “GOTOs considered harmful” • Exchange control for understanding Libraries GENERALITY 🌏 ⚖ POWER 🚀 Applications
STRUCTURED ABSTRACTION TRADE-OFFS • “GOTOs considered harmful” • Exchange control for understanding Libraries GENERALITY 🌏 ⚖ POWER 🚀 Applications
STRUCTURED ABSTRACTION TRADE-OFFS • “GOTOs considered harmful” • Exchange control for understanding Functor/Enum Libraries GENERALITY 🌏 ⚖ POWER 🚀 Applications
STRUCTURED ABSTRACTION TRADE-OFFS • “GOTOs considered harmful” • Exchange control for understanding Functor/Enum Libraries GENERALITY 🌏 Persistent/Ecto ⚖ POWER 🚀 Applications
STRUCTURED ABSTRACTION TRADE-OFFS • “GOTOs considered harmful” • Exchange control for understanding Monad 😉 Functor/Enum Libraries GENERALITY 🌏 Persistent/Ecto ⚖ POWER 🚀 Applications
STRUCTURED ABSTRACTION SIMPLE EXAMPLE: SEMIGROUP
STRUCTURED ABSTRACTION SIMPLE EXAMPLE: SEMIGROUP • Not a data structure
STRUCTURED ABSTRACTION SIMPLE EXAMPLE: SEMIGROUP • Not a data structure • Not a function
STRUCTURED ABSTRACTION SIMPLE EXAMPLE: SEMIGROUP • Not a data structure • Not a function • An interface & rules!
STRUCTURED ABSTRACTION SIMPLE EXAMPLE: SEMIGROUP • Not a data structure • Not a function • An interface & rules!
STRUCTURED ABSTRACTION A SEMIGROUP ON…
STRUCTURED ABSTRACTION A SEMIGROUP ON…
STRUCTURED ABSTRACTION A SEMIGROUP ON…
STRUCTURED ABSTRACTION A SEMIGROUP ON…
STRUCTURED ABSTRACTION UNLAWFUL COUNTEREXAMPLE 🚨
STRUCTURED ABSTRACTION W E U S E L O T S O F D I F F E R E N T F E AT U R E S D A I LY
STRUCTURED ABSTRACTION W E U S E L O T S O F D I F F E R E N T F E AT U R E S D A I LY • Promises (AKA async/await) • Network • Database • Long computation
STRUCTURED ABSTRACTION W E U S E L O T S O F D I F F E R E N T F E AT U R E S D A I LY • Promises (AKA async/await) • Network • Database • Long computation • throw/catch
STRUCTURED ABSTRACTION W E U S E L O T S O F D I F F E R E N T F E AT U R E S D A I LY • Promises (AKA async/await) • Network • Database • Long computation • throw/catch • Tracing
STRUCTURED ABSTRACTION W E U S E L O T S O F D I F F E R E N T F E AT U R E S D A I LY • Promises (AKA async/await) • Network • Database • Long computation • throw/catch • Tracing • Context or config values
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T
STRUCTURED ABSTRACTION B U T M AY B E N O T S O D I F F E R E N T 🚂 ⏲ ⛓ 🖊
STRUCTURED ABSTRACTION YOU’RE ALREADY DOING THIS
STRUCTURED ABSTRACTION YOU’RE ALREADY DOING THIS 🤾 S U R P R I S E AT T A C K E F F E C T S 💥
FRONT EFFECTS
FRONT EFFECTS 👋
FRONT EFFECTS SIDE EFFECTS
FRONT EFFECTS SIDE EFFECTS • Implicit effects that happen “off to the side”
FRONT EFFECTS SIDE EFFECTS • Implicit effects that happen “off to the side” • Built into the language / platform
FRONT EFFECTS SIDE EFFECTS • Implicit effects that happen “off to the side” • Built into the language / platform • Hard to inspect
FRONT EFFECTS SIDE EFFECTS • Implicit effects that happen “off to the side” • Built into the language / platform • Hard to inspect • …thus hard to change, compose, or test
FRONT EFFECTS E F F E C T S - A S - D ATA
FRONT EFFECTS E F F E C T S - A S - D ATA • Data is simple
FRONT EFFECTS E F F E C T S - A S - D ATA • Data is simple • Effects don’t need to be separate: express effects as data
FRONT EFFECTS E F F E C T S - A S - D ATA • Data is simple • Effects don’t need to be separate: express effects as data • Write your own effects
FRONT EFFECTS E F F E C T S - A S - D ATA • Data is simple • Effects don’t need to be separate: express effects as data • Write your own effects • Inspect them as needed
FRONT EFFECTS E F F E C T S - A S - D ATA • Data is simple • Effects don’t need to be separate: express effects as data • Write your own effects • Inspect them as needed • Compose as needed
FRONT EFFECTS ENTER THE MONAD
FRONT EFFECTS ENTER THE MONAD • A common interface to make this straightforward!
FRONT EFFECTS ENTER THE MONAD • A common interface to make this straightforward! • Learn once, use everywhere
THE FUNCTOR TOWER
THE FUNCTOR TOWER 🗼 LET ’S COVER SOME INTERNALS
THE FUNCTOR TOWER Progress is possible only if we train ourselves to think about programs without thinking of them as pieces of executable code 🚀 EDSGER DIJKSTRA
THE FUNCTOR TOWER F U N CTO R
THE FUNCTOR TOWER F U N CTO R • Always returns the same shape!
THE FUNCTOR TOWER F U N CTO R • Always returns the same shape! Functor.map
THE FUNCTOR TOWER F U N CTO R • Always returns the same shape! Functor.map
THE FUNCTOR TOWER A P P LY Functor.map
THE FUNCTOR TOWER A P P LY Functor.map Apply.apply
THE FUNCTOR TOWER A P P L I C AT I V E Functor.map Apply.apply 🙋 AKA return, pure, of, unit
THE FUNCTOR TOWER A P P L I C AT I V E Functor.map Apply.apply Applicative.wrap 🙋 AKA return, pure, of, unit
THE FUNCTOR TOWER CHAIN Functor.map Apply.apply Applicative.wrap
THE FUNCTOR TOWER CHAIN Functor.map Apply.apply Applicative.wrap Chain.bind
THE FUNCTOR TOWER MONAD 6 Functor.map Apply.apply Applicative.wrap Chain.bind
THE FUNCTOR TOWER MONAD 6 Functor.map Apply.apply Applicative.wrap Chain.bind Monad • Monads are the essence of Turing complete, effectual computation
R E S U LT ( S )
THE FUNCTOR TOWER M O N A D ( F I N A L LY ! )
E I T H E R / R E S U LT
E I T H E R / R E S U LT 🚂 RAILROAD PROGRAMMING
E I T H E R / R E S U LT RAILROAD PROGRAMMING
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT RAILROAD PROGRAMMING Happy Path (Continue) Error Case (Skip) No Effect (Afterwards)
E I T H E R / R E S U LT C A R R I E R D ATA
E I T H E R / R E S U LT I N S TA N C E S
E I T H E R / R E S U LT USE
E I T H E R / R E S U LT USE
WRITER
WRITER 🖊 I N S P E C T A B L E , D A TA - O R I E N T E D L O G G I N G
WRITER MONAD 🖊
WRITER MONAD 🖊 Log Program
WRITER MONAD 🖊 Log Program
WRITER C A R R I E R D ATA
WRITER I N S TA N C E S
WRITER USE
READER
READER 📚 CONFIG OR CONTEXT INJECTION
READER MONAD
READER MONAD Context Program
READER MONAD Context Program
READER C A R R I E R D ATA
READER I N S TA N C E S
READER USE
MONADS
MONADS 🚀 A LOT OF POWER FOR A HANDFUL OF FUNCTIONS
https://fission.codes https://tools.fission.codes 8 THANK YOU, MALMÖ 🎉 brooklyn@fission.codes g i t h u b . c o m /e x p e d e @expede
Key takeaways
Much ink has been spilled on what a monad is, but why do people care? As an abstraction, monads hit a sweet spot between being very general while letting the developer retain a lot of control, but this is often hand-waved over. In this talk explores the foundations of this useful abstraction (bootstrapping up from the familiar map function), and what it means for everyday programming tasks, code reuse, testing, and overall code architecture. Examples will be given in both strongly typed (Haskell) and weak/unityped (Elixir) languages.