2016-07-30 5 views
1

이 스 니펫 y.run에는 typecheck가 없습니다.스 카즈 - 스트림이있는 모나드 변압기

could not find implicit value for parameter C: scalaz.Catchable[[x]Test.StateStringTask[x]]

내가 StateStringTask에 대한 Catchable 인스턴스를 생성해야합니까 :

object Test { 

    type StateStringTask[A] = StateStringT[Task, A] 
    type StateStringT[M[_], A] = StateT[M, String, A] 

    val x: Process[Task, Unit] = ??? 

    val y: Process[StateStringTask, Unit] = ??? 

    x.run // This typechecks 

    y.run // This fails 
} 

컴파일러는이 오류를 보여줍니다? 어떻게해야합니까? 또는 Process을 실행할 때 상태 기반 효과를 처리하는 더 쉬운 방법이 있습니까?

답변

0

나는이 최적 추측하지만 난 StateStringTaskCatchable의 인스턴스를 만들어 그것을 가지고 :

implicit val stateStringTaskInstance: Catchable[StateStringTask] = 
    new Catchable[StateStringTask] { 
    // `a.attempt` stackoverflows, don't ask me why :) 
    def attempt[A](a: StateStringTask[A]): StateStringTask[Throwable \/ A] = a >>= (
     x => Catchable[Task].attempt(Applicative[Task].pure(x)).liftM[StateStringT] 
    ) 
    def fail[A](err: Throwable) = Catchable[Task].fail(err).liftM[StateStringT] 
    } 

효과로 TaskProcessStateT 호이스트 합니다. 예 :

def received(queue: Queue[Event]): Process[StateStringTask, Event] = { 
    val toStateStringTask = new (Task ~> StateStringTask) { 
     def apply[A](t: Task[A]): StateStringTask[A] = t.liftM[StateStringT] 
    } 
    // queue.dequeue: Process[Task, Event] 
    queue.dequeue.translate(toStateStringTask) 
    }