2015-07-22 19 views
15

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.

+1

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

+0

@AJFarmar Non penso '(>> =) = join. fmap' funziona. Gli argomenti sono capovolti e ci sono altri problemi. Ma buoni punti! – Alec

+0

Ah, hai ragione, in realtà '(unisciti.). flip fmap', ma l'idea era lì, come dici tu. – AJFarmar

risposta

21

Questo era destinato a succedere con il Applicative-Monad proposal (che ha reso a GHC 7.10). Tuttavia, vi è a technical issue che coinvolge type roles in GHC che ha rinviato all'infinito l'implementazione di ciò che suggerisci.

+6

E questa è la ragione terribile per escludere 'join'. Dovrebbe essere parte della classe Monad. – augustss

+4

@augusts, è un * triste * motivo, non un * cattivo * uno. Essere in grado di usare il newtype generalizzato derivante e le coercizioni per le monadi è una buona cosa. – dfeuer

+1

@dfeuer È come dici tu, ma puoi semplicemente definire 'join 'in modo indipendente e poi usare l'identità' (>> =) = (join.). flip fmap' come ho indicato sopra, quindi non è un grosso problema. – AJFarmar

Problemi correlati