Di seguito è l'opinione di Oleg stesso, con il mio commento e il suo chiarimento.
O.K. Per prima cosa vorrei registrare il mio disaccordo con Gabriel Gonzalez. Non tutti sono d'accordo sul fatto che MonadPlus
deve essere monoid con rispetto a mplus
e mzero
. Il rapporto non dice nulla al riguardo. Lì sono molti casi convincenti quando questo non è così (vedi sotto). Generalmente, la struttura algebrica dovrebbe adattarsi all'attività. Ecco perché abbiamo gruppi e anche semi-gruppi o groupoids più deboli (magmi).Sembra che MonadPlus
sia spesso considerato come una monade di ricerca/non-determinismo. In tal caso, le proprietà di MonadPlus
devono essere quelle che facilitano la ricerca e il ragionamento di sulla ricerca, piuttosto che alcune proprietà ideali ad hoc a cui piace qualcuno per qualsiasi motivo. Vi faccio un esempio: si è tentati di porre la legge
m >> mzero === mzero
Tuttavia, monadi che supportano la ricerca e in grado di fare altri effetti (si pensi NonDeT m
) non può soddisfare tale legge. Ad esempio,
print "OK" >> mzero =/== mzero
perché la stampa lato sinistro qualcosa, ma il destro non lo fa. Allo stesso modo, mplus
non può essere simmetrico: mplus m1 m2
generalmente diverso da mplus m2 m1
, nello stesso modello.
Veniamo a mplus
. Ci sono due ragioni principali per NON richiedere mplus
essere associativi. La prima è la completezza della ricerca. Considera
ones = return 1 `mplus` ones
foo = ones `mplus` return 2
=== {- inlining ones -}
(return 1 `mplus` ones) `mplus` return 2
=== {- associativity -}
return 1 `mplus` (ones `mplus` return 2)
===
return 1 `mplus` foo
Sembrerebbe quindi, coincivamente e foo sono gli stessi. Che significhi, non otterremo mai la risposta 2 da pippo.
Questi risultati sono validi per TUTTA la ricerca che può essere rappresentata da MonadPlus
, quindi lungo come mplus
è associativo e non commutativo. Pertanto, se MonadPlus
è una monade per la ricerca, l'associatività di mplus
è un requisito irragionevole.
Ecco la seconda ragione: a volte desideriamo una ricerca probabilistica - o, in generale, ricerca ponderata, quando alcune alternative sono ponderate . È ovvio che l'operatore di scelta probabilistica non è associativo. Per questo motivo, il nostro documento JFP evita in particolare la struttura di imponente monoid (mplus
, mzero
) su MonadPlus
.
http://okmij.org/ftp/Computation/monads.html#lazy-sharing-nondet (vedere la discussione sulla figura 1 del documento).
R.C. Penso che Gabriel e tu sia d'accordo sul fatto che le monadi di ricerca non mostrano la struttura monoidale . L'argomento si riduce a se MonadPlus
deve essere utilizzato per le ricerche monad o dovrebbe esserci un'altra classe , chiamiamola MonadPlus'
, che è proprio come MonadPlus
ma con leggi più lassiste. Come dici tu, il rapporto non dice nulla su questo argomento e non c'è alcuna autorità da decidere.
Ai fini del ragionamento, non vedo alcun problema con questo - uno deve semplicemente indicare chiaramente le sue ipotesi sulle istanze MonadPlus
.
Per quanto riguarda la regola di riscrittura che ri-soci mplus
'Es, la mera esistenza e l'uso diffuso di MonadPlus
istanze che non sono associative, indipendentemente dal fatto che siano 'spezzato', significa che si dovrebbe probabilmente astenersi dal definendolo.
O.K. immagino non sono d'accordo con la dichiarazione di Gabriel
Le leggi monoid sono il requisito minimo perché senza di loro le altre leggi sono prive di significato. Ad esempio, quando dici mzero >>= f = mzero
, per prima cosa hai bisogno di una definizione ragionevole di mzero
, ma senza le leggi sull'identità non hai questo. Le leggi monoidi sono ciò che mantiene "oneste" le altre leggi proposte. Se non hai leggi monoide allora non hai leggi sensate e qual è il punto di una classe di tipo teorico che non ha leggi?
Ad esempio, carta LogicT e soprattutto la carta JFP ha molti esempi di ragionamento equazionale su non-determinismo senza associatività di mplus
. Il documento JFP omette tutte le leggi monoid per mplus
e mzero
(ma utilizza mzero >>= f === mzero
). Sembra che uno possa avere "onesto" e "leggi sensibili" per non determinismo e ricerca senza le leggi monoidi per mplus
e mzero
.
Sono anche sicuro che non sono d'accordo con l'affermazione
Le due leggi che tutti sono d'accordo che MonadPlus
dovrebbe obbedire sono alle leggi di identità e l'associatività (aka le leggi monoide):
Non sono sicuro che sia stato effettuato un sondaggio su questo. Il rapporto non afferma leggi per mplus
(forse gli autori stavano ancora discutendo di loro). Quindi, io direi che il problema è aperto - e questo è il messaggio principale per ottenere attraverso.
E si ottiene una risposta, e quindi la domanda diventa, se ti fidi di Stack Overflow o Haskell wiki o Oleg Kiselyov. –
Un sacco di tempo, queste regole sono rispettate solo in base a determinate proprietà osservabili. Iirc, la versione veloce di FreeT obbedisce solo a una delle leggi di MonadTrans ('lift. Return == return' penso) se non si può guardare direttamente alla struttura, ma dato che i costruttori sono nascosti va bene. Quindi, in questo caso, potremmo facilmente dire che la legge è abbastanza soddisfatta: purché utilizziamo sempre una strategia di ricerca completa, otterremmo gli stessi risultati e possiamo semplicemente nascondere quale sia la profondità delle cose nella ricerca l'albero è Se sia accettabile violare un po 'le leggi per comodità, chi lo sa. – DarkOtter
Romano, buon punto. –