Gli ascensori, e la duplice nozione di estensioni, sono assolutamente usati in Haskell, forse più prominente nei panni del comonadico extend
e monadico bind
. (In modo confuso, extend
è un ascensore, non un'estensione.) Un contatto w
di extend
ci consente di prendere una funzione w a -> b
e di sollevarla lungo extract :: w b -> b
per ottenere una mappa w a -> w b
. In arte ASCII, dato lo schema
w b
|
V
w a ---> b
dove la freccia verticale è estratto, extend
ci dà una freccia diagonale (facendo i pendolari schema):
-> w b
/ |
/ V
w a ---> b
più familiare alla maggior parte Haskellers è la doppia nozione di bind
(>>=
) per una monade m
. Data una funzione a -> m b
e return :: a -> m a
, possiamo "estendere" la nostra funzione lungo lo return
per ottenere una funzione m a -> m b
. In ASCII art:
a ---> m b
|
V
m a
ci
a ---> m b
| __A
V/
m a
dà (Questo A
è una punta di freccia!)
Quindi sì, extend
avrebbe potuto essere chiamato lift
, e bind
avrebbe potuto essere chiamato extend
. Per quanto riguarda gli lift
di Haskell, non ho idea del motivo per cui sono stati chiamati così!
MODIFICA: In realtà, penso che anche in questo caso, gli lift
di Haskell siano in realtà delle estensioni. Se f
è applicativo e abbiamo una funzione a -> b -> c
, possiamo comporre questa funzione con pure :: c -> f c
per ottenere una funzione a -> b -> f c
. Sporco, è uguale a una funzione (a, b) -> f c
. Ora possiamo anche premere (a, b)
con pure
per ottenere una funzione (a, b) -> f (a, b)
. Ora, per fmap
ing fst
e snd
, otteniamo una funzione f (a, b) -> f a
e f (a, b) -> f b
, che possiamo combinare per ottenere una funzione f (a, b) -> (f a, f b)
. Comporre con il nostro pure
da prima dà (a, b) -> (f a, f b)
. Accidenti!Quindi, per ricapitolare, abbiamo il diagramma di ASCII art
(a, b) ---> f c
|
V
(f a, f b)
Ora liftA2
ci dà una funzione (f a, f b) -> f c
, che non voglio disegnare perché sono stufo di fare diagrammi terribili. Ma il punto è che il diagramma commuta, quindi liftA2
ci dà effettivamente un'estensione della freccia orizzontale lungo quella verticale.
+1 per avermi fatto una risatina per quanto poco ho capito di questa risposta sul primo, secondo e terzo passaggio. I diagrammi ASCII lo fanno, IMHO. –