Предположим, у нас есть две монады, 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')
.