2013-09-21 5 views
3

Arrow을 만드는 방법 FreeMonadFree을 만드는 방법은 무엇입니까?무료 및 MonadFree의 화살표

class (Functor f, Monad m) => MonadFree f m where ... 

data Free f a = Impure (f (Free f a)) | Pure a 

MonadFree 2 개 매개 변수 mf 포함되어 있지만 f을 삽입 할 공간을 Kleisli이 없다, 그래서 우리는 MonadFree에 대한 Kleisli 화살표를 사용할 수 없습니다. 구현 trival 아니다처럼의 인스턴스

+3

'Kleisli (FreeT f m)'을 사용해 보셨습니까? –

+0

멋진! 시도해 볼게! – wit

+0

@SjoerdVisscher 답변으로 쓰시겠습니까? – AndrewC

답변

1

m' 경우

class Arrow a => ArrowFunctor f a | a -> f where 
    afmap :: a b (f c) 

newtype FKleisli f m a b = FKleisli { runFKleisli :: a -> f (m b) } 

instance (Functor f, Monad m, MonadFree f m) => 
     ArrowFunctor (FKleisli f m a) where ... 

그러나 그것은 본다 : 내가 알고있는 것처럼

, 다음과 같은 클래스하는 newtype은 및 인스턴스를 생성하는 데 필요한 Monad이면 Kleisli m'Arrow (예 : ArrowApply과 같은 다른 관련 유형 안경)의 인스턴스입니다. Kleisli (FreeT f m)를 : 귀하의 경우에는

, 당신은 단지 FreeT f mm'를 설정하고 당신이 원하는 것을 정확하게 얻을 수 있도록, (일부 Functor fMonad m에 대한) 기본이되는 모나드로 FreeT f m을 사용하고 싶습니다.