2014-09-23 4 views

risposta

10

Mentre non ho alcuna esperienza con nessuno di questi, è abbastanza semplice da the articles.

Mentre layers si basa piuttosto su MTL, exteff è un approccio completamente diverso. exteff definisce una monade che contiene informazioni sui suoi effetti nel suo tipo. exteff afferma di risolvere il problema dell'ordine di monad, cioè se le monadi A e B sono intercambiabili, l'approccio classico renderebbe A (B a) e B (A a) tipi diversi. Nel exteff sono uguali.

Dal interface di layers sembra che non abbia risolto il problema.

+0

La pagina github di 'estensible-effects' fornisce descrive alcuni problemi con il pacchetto, da cui solo uno si applica a GHC> 7.8, ovvero: ' Le funzioni comuni non possono essere raggruppate utilizzando typeclasses, ad es. le funzioni ask e getState non possono essere raggruppate con alcuni [...] '(https://github.com/suhailshergill/extensible-effects). Puoi dire di più su come si applica al pacchetto di strati? Penso che tutti noi saremmo interessati a vedere il problema da diversi "angoli". cc: @ibotty –

3

aggiungendo alla risposta di polkovnikov, extensible-effects sono inizialmente effetti codificati e gli effetti in layers (e mtl) sono codificati finali. entrambi gli approcci presentano vantaggi e svantaggi e offrono prestazioni migliori o peggiori in alcuni scenari.

+4

Puoi essere più concreto? In quali specifici scenari l'uno o l'altro approccio si comporta meglio o peggio? – lmm

+0

tornerò a quella risposta quando aggiornerò il [benchmark] (https://github.com/feuerbach/freemonad-benchmark) per testare anche i casi in cui le monadi libere funzionano meglio. – ibotty

+2

Suppongo che non avrò tempo per molto tempo. il succo è, che con mtl/layers (o più precisamente: trasformatori) si paga ogni volta che si aggiunge un nuovo trasformatore. sollevare con 't (t1 (t2 (t3 m)))' è piuttosto costoso e non necessario con un approccio monad-free come si usa 'estensibile-effects'. ma: con un solo trasformatore è ** molto ** più veloce degli effetti estensibili. questo è ciò che puoi vedere nel benchmark che ho collegato. – ibotty