Le style sans point est considéré par certains auteurs comme la ultime style de programmation fonctionnel. Pour simplifier, une fonction de type t1 -> t2
décrit une transformation d'un élément de type t1
dans un autre élément de type t2
. L'idée est que les fonctions "inutiles" (écrites à l'aide de variables) mettent l'accent sur les aspects suivants éléments (lorsque vous écrivez \x -> ... x ...
vous décrivez ce qui arrive à l'élément x
), tandis que les fonctions "sans point" (exprimées sans utiliser de variables) mettent l'accent sur l'élément transformation elle-même, comme une composition de transformations plus simples. Les défenseurs du style sans point soutiennent que les transformations devraient en effet être le concept central, et que la notation ponctuelle, bien que facile à utiliser, nous détourne de ce noble idéal.
La programmation fonctionnelle sans point est disponible depuis très longtemps. Elle était déjà connue des logiciens qui ont étudié logique combinatoire depuis le travail fondateur de Moses Schönfinkel en 1924, et a servi de base à la première étude sur ce qui allait devenir l'inférence de type ML par Robert Feys et Haskell Curry dans les années 1950.
L'idée de construire des fonctions à partir d'un ensemble expressif de combinateurs de base est très séduisante et a été appliquée dans divers domaines, tels que les langages de manipulation de tableaux dérivés de la méthode APL ou les bibliothèques de combinateurs d'analyseurs telles que la bibliothèque de Haskell Parsec . Un défenseur notable de la programmation sans point est John Backus . Dans son discours de 1978 intitulé "Can Programming Be Liberated From the Von Neumann Style ?" (La programmation peut-elle être libérée du style Von Neumann ?), il a écrit :
L'expression lambda (avec ses règles de substitution) est capable de de définir toutes les fonctions calculables possibles de tous les types possibles et de n'importe quel nombre d'arguments. Cette liberté et cette puissance ont leurs inconvénients que ses avantages évidents. Elle est analogue au pouvoir des instructions de contrôle non limitées dans les langages conventionnels conventionnels : la liberté illimitée est synonyme de chaos. Si un Si l'on invente constamment de nouvelles formes de combinaisons pour comme on peut le faire dans le calcul lambda, on ne se familiarisera pas avec le style ou les le style ou les propriétés utiles des quelques formes de combinaison qui qui conviennent à tous les usages. Tout comme la programmation structurée de contrôle afin d'obtenir des programmes à la structure plus simple, une meilleure structure plus simple, de meilleures propriétés et des méthodes comprendre leur comportement, la programmation fonctionnelle renonce à l'expression lambda l'expression lambda, la substitution et les fonctions multiples types de fonctions. Elle permet ainsi d'obtenir des programmes construits avec des formes fonctionnelles formes fonctionnelles familières avec des propriétés utiles connues. Ces programmes sont structurés de telle sorte que leur comportement peut souvent être compris et être compris et prouvé par l'utilisation mécanique de techniques algébriques similaires à celles utilisées pour résoudre des problèmes d'algèbre au lycée.
Les voici donc. Le principal avantage de la programmation sans point est qu'elle impose un style de combinateur structuré qui rend le raisonnement équationnel naturel. Le raisonnement équationnel a été particulièrement mis en avant par les partisans du mouvement "Squiggol" (voir [1] [2]), et utilise en effet une bonne part de combinateurs sans points et de règles de calcul/réécriture/raisonnement.
Enfin, l'une des raisons de la popularité de la programmation sans point parmi les Haskellites est sa relation avec le concept de théorie des catégories . Dans la théorie des catégories, les morphismes (que l'on pourrait considérer comme des "transformations entre objets") sont l'objet fondamental de l'étude et du calcul. Bien que des résultats partiels permettent de raisonner dans des catégories spécifiques dans un style ponctuel, la manière courante de construire, d'examiner et de manipuler les flèches reste le style sans point, et d'autres syntaxes telles que les diagrammes de chaînes de caractères présentent également cette "absence de point". Il existe des liens assez étroits entre les défenseurs des méthodes d'"algèbre de programmation" et les utilisateurs de catégories en programmation (par exemple, les auteurs de l'article sur la banane [2] sont/étaient des catégoristes purs et durs).
Vous pouvez être intéressé par la Page Pointfree du wiki Haskell.
L'inconvénient du style sans point est assez évident : il peut être très difficile à lire. La raison pour laquelle nous aimons toujours utiliser les variables, malgré les nombreuses horreurs de l'ombrage, de l'équivalence alpha, etc., est qu'il s'agit d'une notation qui est tout simplement naturelle à lire et à penser. L'idée générale est qu'une fonction complexe (dans un langage référentiellement transparent) est comme un système de plomberie complexe : les entrées sont les paramètres, ils entrent dans des tuyaux, sont appliqués à des fonctions internes, dupliqués ( \x -> (x,x)
) ou oubliée ( \x -> ()
(tuyau ne menant nulle part), etc. Et la notation des variables est joliment implicite à propos de toute cette machinerie : vous donnez un nom à l'entrée, et des noms aux sorties (ou aux calculs auxiliaires), mais vous n'avez pas besoin de décrire tout le plan de plomberie, où les petits tuyaux iront pour ne pas gêner les plus gros, etc. La quantité de plomberie à l'intérieur de quelque chose d'aussi court que \(f,x,y) -> ((x,y), f x y)
est étonnante. Vous pouvez suivre chaque variable individuellement, ou lire chaque nœud de plomberie intermédiaire, mais vous n'avez jamais besoin de voir l'ensemble de la machinerie. Lorsque vous utilisez un style sans point, toute la plomberie est explicite, vous devez tout écrire et le regarder après coup, et parfois c'est tout simplement laid.
PS : cette vision de la plomberie est étroitement liée aux langages de programmation à pile, qui sont probablement les langages de programmation les moins utiles (à peine) en usage. Je recommanderais d'essayer de programmer dans ces langages juste pour en avoir une idée (comme je recommanderais la programmation logique). Voir Facteur , Chat ou le vénérable Quatrième .