как добиться эффекта «произведения двух монад»?

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

11
задан gatoatigrado 26 January 2012 в 02:34
поделиться