La libreria extensible effects e la libreria layers sembrano avere gli stessi obiettivi (semplificando la composizione di effetti diversi insieme). Entrambi parlano dei vantaggi che offrono rispetto a mtl, ma nessuno dei due fa riferimento all'altro. Possono entrambi realizzare la stessa cosa? Si sussume l'altro? Ognuno ha qualche caratteristica che manca all'altro?Quali sono le differenze tra livelli ed effetti estensibili?
risposta
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.
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.
Puoi essere più concreto? In quali specifici scenari l'uno o l'altro approccio si comporta meglio o peggio? – lmm
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
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
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 –