Предположим, у нас есть две монады, m
и m '
. Теперь предположим, что у нас есть переменные,
-- 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
Есть ли способ создать что-нибудь похожее на произведение m x m '
? Я знаю, что это возможно со стрелками, но это кажется более сложным (невозможным?) Для монад, особенно когда вы пытаетесь написать, что должен делать mx >> = f
.
Чтобы увидеть это, определите
data ProdM a = ProdM (m a) (m' a)
instance Monad ProdM where
return x = ProdM (return x) (return x)
, но теперь, когда мы определяем mx >> = f
, неясно, какое значение из mx
передать в f
,
(ProdM mx mx') >>= f
{- result 1 -} = mx >>= f
{- result 2 -} = mx' >>= f
Я хочу, чтобы (mx >> = f) :: ProdM
был изоморфен ((mx >> = f) :: m) x ((mx >> = f) :: m ')
.