为什么这不是 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。
看看Set
。 Set
在其一个参数中是单子的,除了所述参数需要是 Ord
。也就是说,Set
是 Hask 子类别上的 monad,其中所有对象都在 Ord
.
中
但是 Transform
首先不是 monad。 Transform :: (* -> *) -> * -> * -> *
,但 Monad
适用于同类事物 * -> *
(如果你要成为完整的范畴理论家,单子通常是内函子并且应该大致具有种类 k -> k
一些 k
,但 Transform
也不太适合那个更宽的模板)。当 m
是 monad 时,monad 是 Transform m a
。 Transform 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
的情况下是。
在下面的代码片段中,我最初认为有一个受限的 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。
看看Set
。 Set
在其一个参数中是单子的,除了所述参数需要是 Ord
。也就是说,Set
是 Hask 子类别上的 monad,其中所有对象都在 Ord
.
但是 Transform
首先不是 monad。 Transform :: (* -> *) -> * -> * -> *
,但 Monad
适用于同类事物 * -> *
(如果你要成为完整的范畴理论家,单子通常是内函子并且应该大致具有种类 k -> k
一些 k
,但 Transform
也不太适合那个更宽的模板)。当 m
是 monad 时,monad 是 Transform m a
。 Transform 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
的情况下是。