Una cosa che ho notato è che Tuple
non ha un'istanza Monad
.Perché Tuple non ha un'istanza Monad?
Tuple ha tuttavia un Applicative
esempio:
instance Monoid a => Applicative ((,) a)
che limita già estremamente pesante quello che possiamo fare l'istanza Monad
essere.
consente di guardare la firma di tipo otterremmo per unirsi:
instance Monoid a => Monad ((,) a)
join :: Monad m => m (m a) -> m a
join :: Monoid a => (a, (a, b)) -> (a, b)
Possiamo anche osservare le leggi Monade:
join $ f <$> pure x == f x
join $ f <$> (mempty, x) == f x
join (mempty, f x) == f x
join (mempty, (a, b)) == (a, b)
join $ pure <$> x = x
join $ pure <$> (a, b) = (a, b)
join (a, (mempty, b)) = (a, b)
A questo punto sappiamo che la combinazione mempty
e x
in in entrambi i casi risulta x
. E l'unica informazione di tipo che abbiamo su x
è che è un Monoid
. Quindi, in pratica gli unici due implementazioni sono:
join (a, (b, x)) = (a <> b, x)
e:
join (a, (b, x)) = (b <> a, x)
E la seconda una di quelle marche ap
e <*>
non lo stesso.
Così ora sappiamo che l'unico Monad
istanza valida per ((,) a)
è:
instance Monoid a => Monad ((,) a) where
(a, c) >>= f = let (b, c') = f c in (a <> b, c')
Allora, perché questo non è il caso attualmente?
Immagino che sia nuovo con 'ghc-8.1' -' ghci' dice 'istanza Monoid a => Monade ((,) a) - Definito in 'GHC.Base'' – Michael
Un'ipotesi selvaggia: perché non è abbastanza generale? Potrebbe essere il motivo per cui 'Set' non ne ha uno ... – ThreeFx
' Set' non ha istanze monade perché non può esistere alcuna istanza che soddisfi le leggi della monade. L'istanza proposta fo '((,) a)' è rispettosa della legge, e penso che sia l'unica istanza rispettosa della legge, quindi ha senso crearla. – amalloy