2014-07-21 3 views
19

Guardando la documentazione Haskell, il sollevamento sembra essere fondamentalmente una generalizzazione di fmap, consentendo la mappatura delle funzioni con più di un argomento.In che modo il sollevamento (in un contesto di programmazione funzionale) si riferisce alla teoria delle categorie?

L'articolo Wikipedia su sollevamento offre tuttavia una visione diversa, definendo un "sollevamento" in termini di morfismo in una categoria e in che modo si riferisce agli altri oggetti e morfismi nella categoria (non fornirò i dettagli Qui). Suppongo che ciò potrebbe essere rilevante per la situazione di Haskell se consideriamo Cat (la categoria di categorie, rendendo così i nostri morfismi funtori), ma non riesco a vedere come questa nozione teoretica di categoria di un ascensore rappresenti quella di Haskell basato sull'articolo collegato, se non del tutto.

Se i due concetti non sono realmente correlati e hanno solo un nome simile, gli ascensori (teoria delle categorie) sono usati in Haskell?

risposta

20

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.

+0

+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. –