Citazione Wikipedia:
un combinatore è una funzione di ordine superiore che utilizza solo la funzione di applicazione e combinatori definiti in precedenza per definire un risultato dai suoi argomenti.
Ora cosa significa? Significa che un combinatore è una funzione (l'output è determinato unicamente dal suo input) il cui input include una funzione come argomento.
Che aspetto hanno queste funzioni e a che cosa servono? Ecco alcuni esempi:
(f o g)(x) = f(g(x))
qui o
è un combinatore che prende in 2 funzioni, f
e g
, e restituisce una funzione come risultato, la composizione di f
con g
, cioè f o g
.
Gli abbinatori possono essere utilizzati per nascondere la logica. Diciamo che abbiamo un tipo di dati NumberUndefined
, dove NumberUndefined
può assumere un valore numerico Num x
o un valore Undefined
, dove x
a è un Number
. Ora vogliamo costruire addizione, sottrazione, moltiplicazione e divisione per questo nuovo tipo numerico. La semantica è la stessa di quella di Number
, tranne se Undefined
è un input, l'output deve essere anche Undefined
e quando si divide per il numero 0
l'output è anche Undefined
.
Si potrebbe scrivere il codice noioso come di seguito:
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)
Notate come l'hanno tutti la stessa logica riguardante Undefined
valori di input. Solo la divisione fa un po 'di più. La soluzione è estrarre la logica rendendola un combinatore.
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
Questo può essere generalizzato nel cosiddetto Maybe
monade che i programmatori fanno uso di linguaggi funzionali come Haskell, ma non voglio andare lì.
fonte
2010-02-06 23:45:52
speravo in qualcosa di un po 'più introduttivo rispetto alle dreamsongs uno. Forse con qualche motivazione in più su quale problema si rivolgono ecc. – interstar