Supponiamo di avere due monadi, m
e m'
. Ora, supponiamo di avere variabili,come ottenere l'effetto "prodotto di due monadi"?
-- in real problems, the restriction is some subclass MyMonad, so don't worry
-- if it's the case here that mx and f must essentially be pure.
mx :: Monad m'' => m'' a
f :: Monad m'' => a -> m'' b
C'è un modo per creare qualcosa di simile al prodotto m x m'
? So che questo è possibile con Arrows, ma sembra più complicato (impossibile?) Per le monadi, soprattutto quando si cerca di scrivere ciò che dovrebbe fare mx >>= f
.
di vedere questo, definire
data ProdM a = ProdM (m a) (m' a)
instance Monad ProdM where
return x = ProdM (return x) (return x)
ma ora, quando definiamo mx >>= f
, non è chiaro quale valore da mx
da passare al f
,
(ProdM mx mx') >>= f
{- result 1 -} = mx >>= f
{- result 2 -} = mx' >>= f
voglio (mx >>= f) :: ProdM
essere isomorfo a ((mx >>= f) :: m) x ((mx >>= f) :: m')
.
La soluzione di ehird significa anche che l'azione f viene eseguita due volte. Questo potrebbe essere inaspettato se le monadi mem 'hanno effetti collaterali osservabili. – Lemming