In Haskell, le monadi sono definite in termini di funzioni return e bind, dove return ha type a -> m a
e bind ha tipo m a -> (a -> m b) -> m b
. È stato sottolineato prima che lo monads can also be defined in terms of return and join, dove join è una funzione con tipo m (m a) -> m a
. Il binding può essere definito in termini di join, ma è possibile il contrario? Unirsi può essere definito in termini di vincolo?Con monadi, è possibile unire un join in termini di bind?
Senza join, non ho idea di cosa farei se trovassi un valore monadico "doppio avvolto", m (m a)
- nessuna delle operazioni del functor o monad "rimuove alcun livello", per così dire. Se questo non è possibile, perché Haskell e molte altre implementazioni di monad li definiscono in termini di legatura? Sembra strettamente meno utile di una definizione basata su join.
Nota "anche": se aderire non poteva essere definito in termini di vicolo cieco, sarebbe _deve_ essere un membro di 'Monad' (o non sarebbe definito per tutte le monadi), e non lo è. –