Les monades en Emoji

Par Thomas Bracher

Monade par ci, monade par là

  1. Monade + Traversable = 80% d'Haskell/purescript
  2. Outils de composition
  3. Osef des maths, on est là pour parler fonctionnel

Rappel de 3 fonctions d'un Array

  1. Pure
  2. Map
  3. Join

Trivial : Une pomme, i.e. un tableau de pommes

pure :: 🍎 → Array 🍎

Un peu plus compliqué : mapper une fonction

bake :: 🍎 → 🥧

bakes :: Array 🍎 → Array 🥧

map :: (🍎 → 🥧) → (Array 🍎 → Array 🥧)

Pas si simple : mapper puis applatir un tableau

join :: Array (Array 🍎) → Array 🍎

Petit excercice

bake :: 🍎 → 🥧

harvest :: 🌳 → Array 🍎

Comment obtenir harvestAndBake :: 🌳 → Array 🥧 ?

Et harvestAndBakeField :: Array 🌳 → Array 🥧 ?

Solution en code

bake :: 🍎 → 🥧
harvest :: 🌳 → Array 🍎

harvestAndBake :: 🌳 → Array 🥧
harvestAndBake tree = map bake (harvest tree)

harvestAndBakeField :: Array 🌳 → Array 🥧
harvestAndBakeField trees = join (map harvestAndBake trees)

Les tableaux c'est beau,

quid des effets de bords ?

() → 🍎

Pure ?

pure :: 🍎 → (() → 🍎)

Map ?

map :: (🍎 → 🥧) → ((() → 🍎) → (() → 🥧)) ?

appleProvider :: () → 🍎
bake :: 🍎 → 🥧
pure :: 🥧 → (() → 🥧)

Join ?

join :: (() → (() → 🍎)) → (() → 🍎)
() → 🍎 == Effect 🍎
join :: Effect (Effect 🍎) → Effect 🍎

Un effet de bord, c'est une monade !

bake :: 🍎 → 🥧
harvest :: 🌳 → Effect 🍎

harvestAndBake :: 🌳 → Effect 🥧
harvestAndBake tree = map bake (harvest tree)

harvestAndBakeField :: Effect 🌳 → Effect 🥧
harvestAndBakeField trees = join (map harvestAndBake trees)

Ce qu'il vous reste à voir:

  1. bind :: (🌳 → Effect 🥧) → (Effect 🌳 → Effect 🥧)
  2. La do-notation : rendre lisible l'utilisation du bind
  3. La pratique (préférablement plus que 10 minutes)
  4. Traversable

Merci 