从类型约束的角度来看,Monad是从Applicative派生出来的,这和我在题目中写的是相反的。 但是,这不是错误。 在研究Monad的时候,我检查了下面所有的关系,看是否满足。 具体来说,我总是检查 Applicative(和 Functor)是否自然地从 Monad 派生。
// 0. Monad -> Monad
join mma = mma >>= id
ma >> mb = ma >>= const mb
// 1. Moand -> Applicative
mf <*> ma = do
x <- mf
y <- ma
return (x y)
pure = return
// 2. Monad -> Functor
fmap f ma = ma >>= return . f
// 3. Applicative -> Applicative
fa *> fb = pure (const id) <*> fa <*> fb
// 4. Applicative -> Functor
f <$> fa = pure f <*> fa
// 5. Applicative -> Monoid (for Monoid a)
mempty = pure mempty
fa <> fa' = (<>) <$> fa <*> fa'
// 6. Foldable -> Foldable
foldr f z ta = (foldMap f ta) z // f :: a -> (b -> b). We consider (b -> b) as Endo monoid
foldMap f ta = foldr (\x y -> f x <> y) mempty ta
// 7. Traversable -> Functor
fmap f ta = runIdentity $ traverse (Identity . f) ta
// 8. Traversable -> Foldable
foldMap f ta = getConstant $ traverse (Constant . f) ta
很酷。 我检查了所有的 Monad,以便所有实例(Monad、Functor、Applicative、Monoid、Foldable、Traversable)都具有相同的上下文。
万物和谐,遵循以上0~9法则。 Maybe, Either, List, Reader, Writer, State, Constant, Products of arbitrary number of types with duplicated types 等......
现在,我终于进入了现在正在看的书里的Monad Transformers章节
我有麻烦了。
我无法检查 MaybeT 的 Applicative 实例是否与 MaybeT 的 Monad 实例对齐。
实际上,除了 IdentityT,我所有的 MonadTransformer 都失败了。
MaybeT mMf :: MaybeT m (a -> b)
MaybeT mMa :: MaybeT m a
mMf :: m (Maybe (a -> b))
mMa :: m (Maybe a)
MaybeT $ (<*>) <$> (MaybeT mMf) <*> mMa == do
x <- mMf
y <- mMa
return (x y) // is this true???
//given
MaybeT mMx :: MaybeT m x
mMx :: m (Maybe x)
f :: x -> MaybeT m y
MaybeT mMx >>= f =
MaybeT $ do
Mx <- mMx
case Mx of
Nothing -> return Nothing
Just x -> runMaybeT (f x)
return = pure
pure = MaybeT . pure . pure
我可以得到一些帮助来确保 MaybeT 的 Applicative 与 MaybeT 的 Monad 在相同的上下文中吗?