E 'un fatto ben noto che (>>=)
può essere implementato utilizzando fmap
e join
mentre join
può essere implementato usando >>=
. C'è qualche ragione per cui non definiamo la classe Monad
con join
inclusa e usiamo le seguenti definizioni predefinite?Perché non è `parte join` del` Monad` classe
join x = x >>= id
x >>= f = join $ f <$> x
Ciò consentirebbe una definizione minima per includere sia solo (>>=)
o join
, invece di costringere (>>=)
. Potrebbe essere un po 'utile considerando che la teoria delle categorie tende a favorire lo join
.
Il solito argomento contro la modifica delle classi è che interrompiamo la compatibilità. Tuttavia, in questo caso, ciò non accadrebbe - aggiungiamo solo la possibilità di definire Monad
utilizzando join
.
Come dici tu, '(>> =) = join. fmap', ma prima di GHC 7.10 'Monad' non era * automaticamente * un funtore. In questo senso, definiamo sia 'join' che' fmap' in 'bind'. A volte è anche molto più semplice implementare '>> =' di join. Prova a farlo per, diciamo, il parser/state functor. – AJFarmar
@AJFarmar Non penso '(>> =) = join. fmap' funziona. Gli argomenti sono capovolti e ci sono altri problemi. Ma buoni punti! – Alec
Ah, hai ragione, in realtà '(unisciti.). flip fmap', ma l'idea era lì, come dici tu. – AJFarmar