2016-10-08 9 views
7

Control.Monad.Morph含まのインスタンスのいずれもMonad m制約を使用しない、私の知る限りControl.Monad.Morph.hoistにMonadの制約があるのはなぜですか?

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

が含まれています。どのようにそうすることができますか?制約を使用する有効なインスタンスがありますか(それはhoist id = idのように、どのように想像するのが難しいですか)? mにある制約の意味は、nではないのですか?

+0

['Control.Monad.Trans.Compose'](https://hackage.haskell.org/package/mmorph-1.0.6/docs/Control-Monad-Trans-Compose)に何か不具合があります。 html)ですが、全てが 'ホイスト 'の' Monad m'なしでうまくコンパイルされます... – Alec

+0

おそらくモナドのためだけに意味があるのでしょうか?私が見る限りモナド変圧器(スタック)上のファンクタです。 – Xeo

+0

@Alec 'Control.Monad.Trans.Compose'には' MFunctor'インスタンスがありません。 – Cirdec

答えて

6

Control.Monad.Morphpipesからのスピンオフであるので、私はProxyためMFunctorインスタンスがそれを必要とするので、それはそこだと思う...そして、それはused thereだ十分に確認してくださいと思います。

instance 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 . ffmap f mです。おそらくFunctorという制約があり、そのコードはモナド適用提案の実装よりも前です。

+0

あなたはそれが何をしているのか分かりますか?セマンティクスには「Monad」(または「Functor」)の制約が必要か、効率のみが必要ですか? – dfeuer

+0

'' m'の中に '' hoist nat''を再帰的にマッピングしています。 'Functor'制約は、' m(t m a) 'のような形式のトランスフォーマー' t m a 'にとって驚くべき要件であってはなりません。 – Cirdec

関連する問題