Perché una monade usa "ritorno" o "unità" piuttosto che "lift"?

1

Questa è in parte genuina curiosità e in parte un controllo sulla mia comprensione. Probabilmente mi manca il punto.

In Haskell, perché una monade usa operazioni chiamate return o unit per descrivere l'inserimento di un tipo nel contenitore - sollevandolo nello spazio monadico? Sembra più intuitivo chiamare l'operazione lift .

In questo momento, nel mio (probabilmente scorretto) porto di monade nel mio progetto, sto usando (pseudocodice):

MyThing.lift(x).bind(f)...

anziché

MyThing.unit(x).bind(f)...

perché è più intuitivo per me pensare di sollevare x nello spazio monadico.

È sbagliato? Continuo a essere bruciato dal non pensare in modo astratto abbastanza, e ho il sospetto che sia il caso di nuovo.

    
posta Rob 04.03.2014 - 00:56
fonte

2 risposte

7

Il termine unit deriva dalla teoria delle categorie in cui definiamo una monade come due trasformazioni naturali unit : Identity ~> m e join : m x m ~> m . Nel caso in cui sei curioso, bind f = join . fmap f .

return deriva da do notation dove return sembra appropriatamente algol-ish. In realtà è discutibile se questo fosse un buon nome poiché tende a suggerire che return è una sorta di flusso di controllo invece di essere semplicemente una vecchia funzione.

Di solito riserviamo lift per cose che assomigliano più a un functor e sollevano intere funzioni o monadi. lift :: m a -> t m a e liftM :: (a -> b) -> m a -> m b .

    
risposta data 04.03.2014 - 01:39
fonte
5

Come Benjamin Hodgson ha menzionato nel suo commento, il termine lift viene solitamente applicato al sollevamento di funzioni non monadiche nella monade.

Per quanto riguarda il motivo per cui la funzione viene chiamata in modo specifico return , ovvero perché è utilizzata nello zucchero sintattico do , che è simile a un blocco di codice stile C / ALGOL imperativo, che in genere utilizzava return parola chiave per restituire un valore.

Allo stesso modo, bind è chiamato SelectMany in .NET, perché le sue monade sono intese per assomigliare alle query SQL.

    
risposta data 04.03.2014 - 01:32
fonte

Leggi altre domande sui tag