instance Monad (Transform m a)
定义中添加Monad m =>
)。经过阅读关于受限制单子的许多文章后,我想知道为什么这里的代码是可以正常运行的:
{-# 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
作为单子的例子有何不同,后者确实展示了受限单子的限制。
Set
需要Ord
,而不仅仅是Eq
。 - Mor A.