web-dev-qa-db-fra.com

Qu'est-ce que le style "sans point" (dans la programmation fonctionnelle)?

Une phrase que j'ai remarquée récemment est le concept de style "sans point" ...

Tout d'abord, il y avait this question, et this one .

Ensuite, j'ai découvert ici ils mentionnent "Un autre sujet qui mérite d'être discuté est l'aversion des auteurs pour le style sans point."

Qu'est-ce que le style "sans point"? Quelqu'un peut-il donner une explication concise? Cela a-t-il quelque chose à voir avec le curry "automatique"?

Pour avoir une idée de mon niveau - je me suis enseigné Scheme, et j'ai écrit un simple interpréteur Scheme ... Je comprends ce qu'est le curry "implicite", mais je ne connais aucun Haskell ou ML.

94

Regardez juste le article Wikipedia pour obtenir votre définition:

La programmation tacite (programmation sans point) est un paradigme de programmation dans lequel une définition de fonction n'inclut pas d'informations concernant ses arguments, en utilisant des combinateurs et la composition de fonctions [...] au lieu de variables.

Exemple Haskell:

Conventionnel (vous spécifiez explicitement les arguments):

sum (x:xs) = x + (sum xs)
sum [] = 0

Sans point (sum n'a pas d'arguments explicites - c'est juste un pli avec + Commençant par 0):

 sum = foldr (+) 0

Ou encore plus simple: au lieu de g(x) = f(x), vous pouvez simplement écrire g = f.

Alors oui: c'est étroitement lié au curry (ou à des opérations comme la composition des fonctions).

63
Dario

Le style sans point signifie que les arguments de la fonction en cours de définition ne sont pas explicitement mentionnés, que la fonction est définie par la composition de la fonction.

Si vous avez deux fonctions, comme

square :: a -> a
square x = x*x

inc :: a -> a
inc x = x+1

et si vous voulez combiner ces deux fonctions à une qui calcule x*x+1, vous pouvez le définir "point-full" comme ceci:

f :: a -> a
f x = inc (square x)

L'alternative sans point serait de ne pas parler de l'argument x:

f :: a -> a
f = inc . square
30
sth

Un exemple JavaScript:

//not pointfree cause we receive args
var initials = function(name) {
  return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};

const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();

//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));

initials("hunter stockton thompson");
// 'H. S. T'

Référence

11
Brunno

Le style sans point signifie que le code ne mentionne pas explicitement ses arguments, même s'ils existent et sont utilisés.

Cela fonctionne dans Haskell en raison de la façon dont les fonctions fonctionnent.

Par exemple:

myTake = take

renvoie une fonction qui prend un argument, il n'y a donc aucune raison de taper explicitement l'argument à moins que vous ne le souhaitiez également.

5
Rayne