2021-01-03 11:09:51 +00:00
|
|
|
#+TITLE: voeux 2021 alexandre
|
|
|
|
#+Author: Yann Esposito
|
|
|
|
#+Date: [2021-01-03]
|
|
|
|
|
|
|
|
- tags ::
|
|
|
|
- source ::
|
|
|
|
|
|
|
|
|
|
|
|
Bonjour Alexandre, je te souhaite à toi et toute ta famille une très bonne
|
|
|
|
année 2021 !
|
2021-01-03 11:10:51 +00:00
|
|
|
|
2021-01-03 11:13:21 +00:00
|
|
|
Je vous souhaite à tous une très bonne santé surtout dans le climat actuel.
|
|
|
|
De trouver un bon équilibre entre la vie familiale les passions et le
|
|
|
|
travail.
|
2021-01-03 11:18:29 +00:00
|
|
|
|
|
|
|
J'en profite aussi pour parler d'autres choses techniques.
|
|
|
|
Je n'écris plus vraiment de nouvel article sur Haskell/Purescript.
|
|
|
|
Cependant, j'ai passé pas mal de temps à réfléchir à comment architecturer
|
|
|
|
du code à la fois dans Haskell/Purescript et Clojure.
|
|
|
|
Et j'ai l'impression qu'une solution qu'on utilise actuellement en Clojure
|
|
|
|
bien qu'à première vue très inférieure aux solutions proposées par
|
|
|
|
Haskell/Purescript sont en fait supérieure lorsqu'on les regardes selon le
|
|
|
|
bon angle.
|
|
|
|
|
|
|
|
L'idée de fond c'est que les systèmes d'effets/Free Monad (et les
|
|
|
|
sous-systèmes, style MTL, handler pattern) sont en fait une sorte de sous
|
|
|
|
ensemble de ce que l'on peut obtenir avec un système de "Services".
|
2021-01-03 11:44:52 +00:00
|
|
|
|
|
|
|
Si on regarde l'intérêt de ces système d'organisation de code --
|
|
|
|
le plus évolué étant les Free Monads et les systèmes d'effets --
|
|
|
|
leur objectif est toujours plus ou moins le même.
|
|
|
|
|
|
|
|
Changer le comportement du même bloc de code en fonction du contexte
|
|
|
|
d'exécution.
|
2021-01-03 11:48:36 +00:00
|
|
|
En gros si on prend une function qui ressemble à:
|
|
|
|
|
|
|
|
#+begin_src haskell
|
|
|
|
my_function arg1 ... argn = do
|
|
|
|
x1 <- action1 arg1 .. argn
|
|
|
|
x2 <- action2 arg1 .. argn x1
|
|
|
|
...
|
|
|
|
z <- actionK arg1 .. argn x1 .. x<K-1>
|
|
|
|
return z
|
|
|
|
#+end_src
|
|
|
|
|
2021-01-03 11:51:04 +00:00
|
|
|
les =action1= à =actionK= auront des comportement différents en fonction du
|
|
|
|
contexte dans lequel il va être initialisé.
|
|
|
|
Dans le cas de Haskell, on fait au mieux pour déterminer le contexte à
|
|
|
|
compile time en utilisant les types.
|
|
|
|
Du genre:
|
|
|
|
|
|
|
|
#+begin_src haskell
|
|
|
|
main = do
|
|
|
|
effect1 <- initEffect1
|
|
|
|
effect2 <- initEffect2 effect1
|
|
|
|
...
|
|
|
|
effectM <- initEffectM effect1 ... effect<M-1>
|
|
|
|
runWithEffects [effect1,effect2,...,effectM] my_function
|
|
|
|
#+end_src
|
|
|
|
|
|
|
|
L'avantage énorme est de pouvoir y mettre toute la business logic dans la
|
|
|
|
fonction =my_function=.
|