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限制.
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类型没有限制,但是在其中一种类型上.