Cita Wikipedia:
un combinador es una función de orden superior que utiliza sólo la aplicación de funciones y combinadores definidos anteriormente para definir un resultado a partir de sus argumentos.
¿Qué significa esto? Significa que un combinador es una función (la salida está determinada únicamente por su entrada) cuya entrada incluye una función como argumento.
¿Cómo son estas funciones y para qué se utilizan? He aquí algunos ejemplos:
(f o g)(x) = f(g(x))
Aquí o
es un combinador que lleva en 2 funciones, f
y g
, y devuelve una función como su resultado, la composición de f
con g
, a saber f o g
.
Los combinadores se pueden utilizar para ocultar la lógica. Supongamos que tenemos un tipo de datos NumberUndefined
, donde NumberUndefined
puede tomar un valor numérico Num x
o un valor Undefined
, donde x
a es un Number
. Ahora queremos construir suma, resta, multiplicación y división para este nuevo tipo numérico. La semántica es la misma que la de Number
, excepto si Undefined
es una entrada, la salida también debe ser Undefined
y al dividir por el número 0
, la salida también es Undefined
.
Se podría escribir el código tedioso como a continuación:
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)
Observe cómo la tienen todos la misma lógica en relación con Undefined
valores de entrada. Solo la división hace un poco más. La solución es extraer la lógica haciéndola un combinador.
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
Esto se puede generalizar en la llamada Maybe
mónada que los programadores hacen uso de en los lenguajes funcionales como Haskell, pero no voy a ir allí.
que estaba esperando algo un poco más introductoria de los Dreamsongs uno. Tal vez con un poco más de motivación sobre cuál es el problema que abordan etc. – interstar