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

mcm*_*yer 5 monads haskell ghc

在下面的代码片段中,我最初认为有一个受限制的monad错误(我忘了Monad m =>instance Monad (Transform m a)定义中添加).读了很多关于受限制的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' -> ...
        )
Run Code Online (Sandbox Code Playgroud)

这个例子相当做作,我剥夺了所有不相关的部分.(手头的实际问题与有关.)关键部分是Monad m限制Transform.

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

HTN*_*TNW 6

Transform 不是受限制的单子.

看看Set.Set除了所说的论证之外,它的一个论点是monadic Ord.也就是说,Set是Hask的子类别中的monad,其中所有对象都在其中Ord.

Transform首先不是monad.Transform :: (* -> *) -> * -> * -> *,但Monad适用于那种类型的东西* -> *(如果你要去完全类别的理论家,monad一般都是endofunctors,应该大致k -> k对某些人有所帮助k,但Transform也不适合那些更广泛的模板).monad是Transform m a什么时候m是monad.Transform m a哈斯克的所有人都是monad,只要m也是monad.你看到了区别?Transform m a给定的Monad m每种类型都有.但是我没有什么可以在空白中写出" Set给定___对每种类型进行操作",因为限制是在Setmonadic 的参数上进行,而Transform m a对monadic类型没有限制,但是在其中一种类型上.