deft/journal/2021-01-03--12-08-46Z--voeux_2021_alexandre.org
2021-01-03 12:53:10 +01:00

2.2 KiB
Raw Blame History

voeux 2021 alexandre

tags
source

Bonjour Alexandre, je te souhaite à toi et toute ta famille une très bonne année 2021 !

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.

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".

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. En gros si on prend une function qui ressemble à:

my_function arg1 ... argn = do
  x1 <- action1 arg1 .. argn
  x2 <- action2 arg1 .. argn x1
  ...
  z <- actionK arg1 .. argn x1 .. x<K-1>
  return z

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:

main = do
  effect1 <- initEffect1
  effect2 <- initEffect2 effect1
  ...
  effectM <- initEffectM effect1 ... effect<M-1>
  runWithEffects [effect1,effect2,...,effectM] my_function

Ce système présente ainsi beaucoup d'avantanges L'avantage énorme est de pouvoir y mettre toute la business logic dans la fonction my_function en se débarrassant des détails techniques au mieu en les envoyant dans les "Effets".

Un autre