Citation Wikipedia:
Un combinateur est une fonction d'ordre supérieur qui n'utilise que la fonction de demande et la définition antérieure combinators pour définir un résultat à partir de ses arguments.
Maintenant, qu'est-ce que cela signifie? Cela signifie un combinator est une fonction (sortie est déterminé uniquement par son entrée) dont l'entrée comprend une fonction comme argument.
Ce ne des fonctions, telles ressemble et à quoi servent-ils? Voici quelques exemples:
(f o g)(x) = f(g(x))
Ici, o
est un combinateur qui prend dans les 2 fonctions , f
et g
, et retourne une fonction comme résultat, la composition de l' f
avec g
, à savoir l' f o g
.
Combinators peut être utilisé pour masquer la logique. Disons que nous avons un type de données NumberUndefined
où NumberUndefined
peut prendre une valeur numérique Num x
ou d'une valeur en Undefined
où x
d'un Number
. Maintenant, nous voulons construire l'addition, la soustraction, la multiplication et la division pour ce nouveau type numérique. La sémantique est la même que pour ceux de l' Number
sauf si Undefined
est une entrée, la sortie doit également être Undefined
et en divisant par le nombre 0
la sortie est également Undefined
.
On pourrait écrire les codes ci-dessous:
Undefined +' num = Undefined
num +' Undefined = Undefined
(Num x) +' (Num y) = Num (x + y)
Undefined -' num = Undefined
num -' Undefined = Undefined
(Num x) -' (Num y) = Num (x - y)
Undefined *' num = Undefined
num *' Undefined = Undefined
(Num x) *' (Num y) = Num (x * y)
Undefined /' num = Undefined
num /' Undefined = Undefined
(Num x) /' (Num y) = if y == 0 then Undefined else Num (x / y)
Remarquez comment l'ont tous la même logique concernant l' Undefined
des valeurs d'entrée. Seule division un peu plus. La solution consiste à extraire de la logique en faisant un combinateur.
comb (~) Undefined num = Undefined
comb (~) num Undefined = Undefined
comb (~) (Num x) (Num y) = Num (x ~ y)
x +' y = comb (+) x y
x -' y = comb (-) x y
x *' y = comb (*) x y
x /' y = if y == Num 0 then Undefined else comb (/) x y
Ceci peut être généralisé dans le soi-disant Maybe
monade que les programmeurs utilisent dans les langages fonctionnels comme Haskell, mais je ne vais pas y aller.