为什么这不是 restricted monad 限制的情况?

Why is this not a case of the restricted monad limitation?

在下面的代码片段中,我最初认为有一个受限的 monad 错误(我忘记在 instance Monad (Transform m a) 定义中添加 Monad m =>)。阅读了很多关于受限 monad 的内容后,我想知道为什么这里恰好可以:

{-# LANGUAGE GADTs #-}

data Next a where
    Todo :: a -> Next a
    Done :: Next a

instance Functor Next where
    fmap f Done = Done
    fmap f (Todo a) = Todo (f a)

data Transform m a b = Monad m => Transform ( m(Next a) -> m(Next b) )

instance Functor (Transform m a) where
    fmap f (Transform ta) = Transform tb where
        tb ma = ta ma >>= return . (fmap f)

instance Applicative (Transform m a) where
    pure = return
    mf <*> ma = do
        f <- mf
        a <- ma
        return (f a)

instance Monad m => Monad (Transform m a) where
    return b = Transform (t b) where                
        t b _ = return $ Todo b
    (Transform t) >>= f = Transform (\ma -> do     
        a <- ma
        case a of
            Done -> return Done
            --Todo a' -> ...
        )

这个例子有点做作,我去掉了所有不相关的部分。 (手头的实际问题与有关。)关键部分是Transform中的Monad m限制。

我不太明白这与经常引用的规范 Set-as-a-monad 示例有何不同,后者确实表现出 restricted monad 限制。

Transform 不是受限的 monad。

看看SetSet 在其一个参数中是单子的,除了所述参数需要是 Ord。也就是说,Set 是 Hask 子类别上的 monad,其中所有对象都在 Ord.

但是 Transform 首先不是 monad。 Transform :: (* -> *) -> * -> * -> *,但 Monad 适用于同类事物 * -> *(如果你要成为完整的范畴理论家,单子通常是内函子并且应该大致具有种类 k -> k一些 k,但 Transform 也不太适合那个更宽的模板)。当 m 是 monad 时,monad 是 Transform m aTransform m a 在所有 Hask 上都是 monad,只要 m 也是 monad。你看到区别了吗? Transform m a given Monad m 对所有存在的类型进行操作。但是我没有什么可以在空白处做“Set given ___ 对所有存在的类型进行操作”,因为限制是针对 Set 是 monadic 的参数,虽然 Transform m a 对它是 monadic 的类型没有限制,但对构成它的类型之一有限制。

I don't quite see how this is different from the often-cited canonical Set-as-a-monad example, which does exhibit the restricted monad limitation.

这是不同的,因为约束不在最后一个类型参数上,后者在 Monad 中变化。在 Set 的情况下是。