为什么Control.Monad.Morph.hoist有Monad约束?

时间:2016-10-08 03:49:54

标签: haskell monads typeclass functor

Control.Monad.Morph包括

class MFunctor t where
  hoist :: Monad m => (forall a. m a -> n a) -> t m b -> t n b

据我所知,所包含的实例都没有使用Monad m约束。怎么可能这样做?是否有使用约束的有效实例(考虑到hoist id = id,我有点难以想象如何?)约束对m而非n的重要性是什么?

1 个答案:

答案 0 :(得分:7)

@RequestParam("birthdayTime") String birthdayTime @RequestParam("birthdayReminder") String reminderTag pipes的衍生产品,所以我猜它是因为Control.Monad.Morph的{​​{1}}实例需要它...当然,它是used there

MFunctor

我认为不需要这样做。 Proxyinstance MFunctor (Proxy a' a b' b) where hoist nat p0 = go (observe p0) where go p = case p of Request a' fa -> Request a' (\a -> go (fa a )) Respond b fb' -> Respond b (\b' -> go (fb' b')) M m -> M (nat (m >>= \p' -> return (go p'))) Pure r -> Pure r 。它可能应该是m >>= return . f约束,并且该代码早于monad-applicative提案的实现。