URL: https://linuxfr.org/forums/programmationautre/posts/paradigme-fonctionnel-juste-un-habillage Title: Paradigme fonctionnel : juste un habillage ? Authors: chimrod Date: 2012年10月26日T15:27:13+02:00 Tags: Score: 3 Bonjour à tous, Je suis en train de m'essayer au fonctionnel, en ce moment ocaml. Mais ma question n'est pas sur le langage mais sur la manière de construire du code fonctionnel. Je soumet ici un bout de code que j'ai fait pour tester qui permet de formater du texte en spécifiant la largeur maximale de chaque ligne : ```ocaml (** Une simple fonction de sortie *) let printer text = print_endline text;; (** Formateur de texte qui va réécrire le texte donné sur un largeur maximale de length *) let format f length = let buffer = Buffer.create length (** Affiche la ligne courante sur la sortie, et relance une ligne vide *) in let finish () = f (Buffer.contents buffer); Buffer.reset buffer; (** Ajoute le texte donné en paramètre au texte en cours. Si la * longueur dépasse, l'affiche sur une nouvelle ligne *) in let join text = let rec assemble extracts = match extracts with | [] -> () | head::tail -> if (Buffer.length buffer) + (String.length head)> length then finish(); Buffer.add_string buffer head; if tail != [] then Buffer.add_string buffer " "; assemble tail in assemble (Str.split_delim (Str.regexp "[ \t]") text) in join, finish;; let concat, terminate = format printer 20 in concat "Ceci"; concat " est un"; concat "e chaine assez "; concat "longue, voir"; concat "e même trop lo"; concat "ngue ! Tellement longue que l'on peut se demander si elle va tenir !"; concat " sur une seule ligne"; terminate();; ``` Le code fonctionne bien et produit le résultat escompté :> Ceci est une chaine> assez longue, voire> même trop longue !> Tellement longue que> l'on peut se> demander si elle va> tenir ! sur une> seule ligne Pourtant, en relisant le code, je suis en train de m'interroger : je suis parti dans l'idée de faire du code fonctionnel, et je l'ai construit comme tel, mais avec le recul, j'ai l'impression d'avoir écrit une classe objet. Si je reprend le code : Voilà qui ressemble à un constructeur de classe avec ses paramètres : ```ocaml let format f length = ``` Ça c'est une variable privée : ```ocaml let buffer = Buffer.create length ``` Enfin je déclare les méthodes de ma classe pour que l'on puisse les utiliser à l'extérieur, j'instancie ma classe, et exécute ses fonctions. : ```ocaml in let finish () = ... in let join text = ... in join, finish;; let concat, terminate = format printer 20 in ``` Je sais bien que fonctionnel/objet ne sont que des représentations d'un même code, mais je ne m'attendais pas à avoir une telle similitude dans la présentation du code. Je vois bien que j'ai utilisé des concepts propre au fonctionnel (pattern matching, code récursif, fermeture) mais je m'attendais à quelque chose de différent. D'où ma question : est-ce que mon interrogation est naïve, et je ne fait que constater des évidences, ou bien est-ce moi qui suis trop imbibé de code objet et n'ai pas réussi à m'en détacher ? J'accepte que l'on me réponde que le code est trop simpliste pour pouvoir mettre en évidence une différence, mais je voulais justement tester un cas réel et éloigné des constructions mathématiques que l'on retrouve habituellement en exemple... Sinon je trouve le langage vraiment agréable, très simple dans la syntaxe, dans lequel on retrouve vite ses marques. Je vais continuer à le tester encore un petit moment...