novembre
2010
Mr Haskell Curry est un logicien qui a donné son nom à une technique utilisée en programmation fonctionnelle, le currying. Celle-ci a pour origine les travaux de Gottlob Frege et Moses Schönfinkel, ce qui a poussé Christopher Strachey à suggérer le nom de schönfikelisation en tant qu’alternative.
Ne nous attardons pas plus longtemps sur les détails triviaux. Voyons ce que le terme signifie en informatique.
Le currying transforme une fonction qui s’applique à une liste de paramètres:
f(x, y, z)
en une fonction qui s’applique à un seul paramètre, qui retourne une autre fonction à un paramètre, etc jusqu’à consommer tous les paramètres.
f(x) -> f'(y) -> f''(z)
En dodo cette transformation se fait en remplaçant les paramètres de la fonction avec des caractères de soulignement _.
def g = f(_, _, _)
On peut appeler cette fonction avec trois paramètres de la façon suivante:
g(1)(3)(n) # = f(1, 3, n)
Quel est l’avantage de faire cela? Et bien cela permet d’appeler g
avec un seul ou deux paramètres, et réutiliser la fonction résultante comme une fonction ordinaire. Dans un langage qui n’utilise que les fonctions curriées cela donne des propriétés intéressantes.
Dodo n’est pas un tel langage mais l’option est là.
Une autre utilisation du caractère de soulignement est d’appeler une fonction avec des paramètres renseignés à l’avance, par exemple:
def normalise = min(_, 100) .x = normalise(x) # contraint x à être inférieur ou égal à 100
Cela peut aussi servir à composer des fonctions:
def positive_sinus = abs(_) & sin(_) positive_sinus(-0.5) # = sin(abs(-0.5))
Ici « &
» sert à combiner les deux fonctions en une nouvelle fonction, qui les applique dans l’ordre à l’argument. Cela ne marche pas avec les fonctions ordinaires, il faut utiliser _.
Tu dois avoir raison, je ne m’étais pas rendu compte qu’il s’agissait d’une transformation dans le même espace de fonctions. Merci de le faire remarquer!
Dans l’esprit de Schönfinkel et de Curry (x,y,z) est un triplet. Dans ce cas on peut curryfier la fonction f. Dans le cas contraire on peut aussi écrire _ pour désigner une variable anonyme, mais c’est autre chose.
Merci SpiceGuid. Est-ce que ta remarque ne s’applique pas plutôt à une fonction déjà curriée, ce qui veut dire que (x, y, z) est un n-uplet et non pas une liste de trois arguments? Alors la transformation suggérée (currying) n’est pas appropriée, si?
Dans l’esprit de Schönfinkel et de Curry, f (x,y,z) n’est pas vraiment une fonction qu’on applique à 3 arguments. Ce serait plutôt une fonction qu’on applique à un seul argument (par exemple un point dans ℝ³).