2016-10-08 12 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

그게 뭔지 알아? 의미 (semantics)에 대해 "모나드 (Monad)"(또는'Functor ') 제약이 필요한가, 아니면 효율성만을 요구 하는가? – dfeuer

+0

''ho' nat''를'm' 내부에 반복적으로 매핑합니다. 'Functor' 제약 조건은'm (t m a)'와 같은 형식의 변 환기't m a '에 대한 놀라운 요구 사항이되어서는 안됩니다. – Cirdec