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]]

Catchableのインスタンスを作成する必要がありますStateStringTaskか? それ、どうやったら出来るの?または、実行時にステートフル効果を処理する簡単な方法はありProcessますか?

4

1 に答える 1

0

これは最適ではないと思いますが、次StateStringTaskのインスタンスを作成して取得しましたCatchable

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]
  }

効果として上に持ち上げるため。例えば:StateTProcessTask

  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)
  }
于 2016-07-31T23:50:36.827 に答える