On est pas vendredi, mais remplacer du shell par du caml ... mis à part des améliorations purement techniques de performances, je ne comprend pas l'intérêt syntaxique (voir l'exemple qui est donné ...)
Après, pour la monade, oui, c'est une solution élégante, mais en OCaml, on ne peut pas garantir la pureté des fonctions, du coup, des méthodes de type « retry » et autres pourraient avoir des comportements étranges ... (si on ne fait pas attention)
Quitte à essayer de construire une bibliothèque qui le fait bien, autant coder directement en Haskell, qui possède tout ce qu'il faut pour combiner des fonctions, et qui permet (via l'évaluation paresseuse) de remplacer les générateurs de python par de simples listes ... et ce sans avoir une syntaxe immonde
cat::String->IO[String]catf=lines<$>readFilef-- En traduisant « mot à mot » l'exemple du journal main::IO()main=cat"fichier">>=return.filter(\s->lengths>0&&(s!!0)/='#')>>=return.maptoFloat>>=return.sort>>=return.take10>>=output-- En ré-écrivant pour utiliser >>= uniquement -- quand nécessaire (préférant (<$>) qui correspond à -- fmap en notation infixe)main::IO()main=(take10<$>sort<$>maptoFloat<$>filter(\s->lengths>0&&(s!!0)/='#')<$>cat"fichier")>>=output-- Enfin, en utilisant fmap f . fmap g = fmap (f . g)main::IO()main=(fmaptraitement(cat"fichier"))>>=outputwheretraitement=take10.sort.maptoFloat.filter()
Pour résumer, oui l'approche monadique (ici avec IO) a beaucoup d'avantages :
Tu peux automatiquement promouvoir n'importe quelle fonction « normale » en une fonction qui agit sur un résultat de « programme » avec fmap ou <$>, ce qui permet d'utiliser toute fonction déjà écrite dans le langage que tu utilises
Tu peux raisonner sur des axiomes simples pour simplifier le code
Le résultat est encore lisible, plus facile à « comprendre » et surtout à modifier (on voit la structure du programme de manière apparente, et pas seulement au travers de commentaires à chaque étape ...)
Le seul problème est l'intégration du code monadique dans le langage, et en python c'est pas toujours « esthétique », le problème en caml se pose moins puisqu'il est possible de définir des opérateurs infixes.
Remarque : c'est le genre de syntaxe que j'ai proposé d'utiliser en mettant en place une classe python dans un autre commentaire.
[^] # Re: Gestion des erreurs
Posté par Aluminium95 . En réponse au journal chaintools, outils unix avec syntaxe pythonique. Évalué à 2.
On est pas vendredi, mais remplacer du shell par du caml ... mis à part des améliorations purement techniques de performances, je ne comprend pas l'intérêt syntaxique (voir l'exemple qui est donné ...)
Après, pour la monade, oui, c'est une solution élégante, mais en OCaml, on ne peut pas garantir la pureté des fonctions, du coup, des méthodes de type « retry » et autres pourraient avoir des comportements étranges ... (si on ne fait pas attention)
Quitte à essayer de construire une bibliothèque qui le fait bien, autant coder directement en Haskell, qui possède tout ce qu'il faut pour combiner des fonctions, et qui permet (via l'évaluation paresseuse) de remplacer les générateurs de python par de simples listes ... et ce sans avoir une syntaxe immonde
Pour résumer, oui l'approche monadique (ici avec
IO) a beaucoup d'avantages :fmapou<$>, ce qui permet d'utiliser toute fonction déjà écrite dans le langage que tu utilisesLe seul problème est l'intégration du code monadique dans le langage, et en python c'est pas toujours « esthétique », le problème en
camlse pose moins puisqu'il est possible de définir des opérateurs infixes.Remarque : c'est le genre de syntaxe que j'ai proposé d'utiliser en mettant en place une classe python dans un autre commentaire.