2016-07-16 120 views
6

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?

+6

Immagino che sia nuovo con 'ghc-8.1' -' ghci' dice 'istanza Monoid a => Monade ((,) a) - Definito in 'GHC.Base'' – Michael

+0

Un'ipotesi selvaggia: perché non è abbastanza generale? Potrebbe essere il motivo per cui 'Set' non ne ha uno ... – ThreeFx

+1

' 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

risposta

1

Beh, sembra che la risposta a questa domanda è che devo solo usare ghc-8.0.1, che dà l'istanza a Monad. Ringraziamo @ Michael per averlo indicato.

+1

'8.1' non è ancora uscito; intendeva '8.0.1'. L'istanza può essere trovata [qui] (https://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad.html#control.i:ic:Monad:Monad:25). – crockeea

+0

@Eric ah ok, grazie! – semicolon

Problemi correlati