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

  1. Broad trend towards functional techniques 2. Handle increasing complexity 3. Familiar != “simple” 4. You’re already sitting in the “polyglot and fringe” track 😉

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

THE FUNCTOR TOWER N OT G RO U P E D BY AC C I D E N T Call D ATA f(x) FUNCTION

R E S U LT Functor D ATA map FUNCTION

R E S U LT ( S ) Apply D ATA apply FUNCTION(S)

R E S U LT ( S ) Chain D ATA bind NK K II N NG G FF U UN N LL II N

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