【问题标题】:Monad transformers with scalaz-streams具有 scalaz 流的 Monad 转换器
【发布时间】:2016-10-24 23:23:36
【问题描述】:

在这个 sn-p 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 时是否有更简单的方法来处理有状态的效果?

【问题讨论】:

    标签: scala monad-transformers scalaz-stream


    【解决方案1】:

    我想这不是最理想的,但我通过将 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]
      }
    

    提升StateT 上的ProcessTask 作为效果。例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多