2016-07-30 5 views
1

このスニペットでは、y.runは型検査を行いません。スカラストリームのモナド変圧器

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 
} 

コンパイラはこのエラーを示しています

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

私はStateStringTaskためCatchableインスタンスを作成する必要がありますか?それ、どうやったら出来るの?または、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) 
    } 
関連する問題