2012-10-13 3 views
6

Sono principalmente un ragazzo pratico ma trovo questo interessante.Comprendere la sequenza nella programmazione funzionale

Ho pensato al sequenziamento monadico e ci sono alcune cose che ho bisogno di chiarire. Quindi, a rischio di sembrare stupido qui è:

Il membro monadica legano

bind :: m b -> (b -> m c) -> m c

può sequenziare "azioni" dando accesso esplicito ai valori intermedi.

Come funziona questo mi danno più che il membro categorica (.):

(.) :: cat b c -> cat a b -> cat a c

Con questo posso sequenziare e accedi ai valori intermedi. Dopo tutto (f . g) x = f(g (x)).

Perché è necessario il bind per il sequenziamento se è possibile eseguire la sequenza con (.)?

+3

La versione monadica di '' 'è (> =>) :: Monade m => (.) (A -> mb) -> (b -> mc) -> (a -> mc) ', composizione di Kleisli. –

+4

Questo ti dà * meno * in realtà. 'C (a, b) = a -> m b' forma una categoria con' bind' come composizione e 'return' come identità, la * Kleisli category * di' m'. –

+4

Inoltre non è del tutto vero che in 'f (g x)' il 'g x' deve prima accadere. Questo sarebbe vero solo sotto una semantica rigorosa. Ma, così com'è, potrebbe essere prima, mentre o non del tutto. – Ingo

risposta

14

Sei sulla strada giusta. Ogni monade dà origine al cosiddetto Kleisli category. Per ogni monade m suo corrispondente categoria Kleisli trovi frecce a -> m b e può essere composto utilizzando >=>, che è definito come

f >=> g  = \x -> f x >>= g 

Kleisli tipo incapsula questo sistema tipo Haskell, si può vedere che ha istanza

instance Monad m => Category (Kleisli m) where 
    id = Kleisli return 
    (Kleisli f) . (Kleisli g) = Kleisli (g >=> f) 

Quindi i calcoli di sequenziamento all'interno di questa categoria sono solo operazioni di sequenziamento utilizzando >=>, che possono essere espressi in modo equivalente utilizzando >>=.

Definiamo monadi utilizzando return e >>= perché è più conveniente, ma potremmo definirli così utilizzando return e >=> se volevamo.

(Vedi anche my answer a Different ways to see a monad.)

+4

Stavo battendo a macchina ma mi hai battuto, quindi aggiungo che le leggi di Monad sono equivalenti alle leggi che fanno di Kleisli una categoria: il giusto e sinistro assorbimento dell'identità e l'associatività della composizione. Nota anche che "ArrowApply" definisce la struttura extra che deve avere una "freccia" per ottenere una monade. 'Kleisli m' non è solo una categoria ma un' Arrow', e ovviamente possiede la struttura extra 'ArrowApply', ma non tutti gli' Arrow's fanno. – pigworker

+0

@pigworker: le leggi non sono equivalenti al 100% in quanto è necessario aggiungere un extra '(g> => h). f = (f.g)> => h' law per dedurre le leggi '>> =' da '> =>' ones.Non ricordo come si chiama, ma mi ha catturato mentre facevo degli esercizi. – hugomg