为什么我在执行error: could not find implicit value for parameter C: scalaz.Catchable[F2]
时会收到以下P(1,2,3).run
?
[scalaz-stream-sandbox]> console
[info] Starting scala interpreter...
[info]
import scalaz.stream._
import scala.concurrent.duration._
P: scalaz.stream.Process.type = scalaz.stream.Process$@7653f01e
Welcome to Scala version 2.11.0-RC3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0).
Type in expressions to have them evaluated.
Type :help for more information.
scala> P(1,2,3).run
<console>:15: error: could not find implicit value for parameter C: scalaz.Catchable[F2]
P(1,2,3).run
^
The scalaz-stream-sandbox project可在GitHub上找到。执行sbt console
然后P(1,2,3).run
来解决问题。
答案 0 :(得分:8)
当您撰写Process(1, 2, 3)
时,您会收到一个Process[Nothing, Int]
,这是一个对特定上下文没有任何想法的过程,它可以针对它进行外部请求。只是要发出一些东西。这意味着您可以将其视为Process0
,例如:
scala> Process(1, 2, 3).toList
res0: List[Int] = List(1, 2, 3)
这也意味着你不能run
它,因为跑步需要一个&#34;驱动程序&#34;上下文。
由于Process
在其第一个类型参数中是协变的,因此您可以在对此上下文具有更具体类型的情况下使用它:
scala> import scalaz.concurrent.Task
import scalaz.concurrent.Task
scala> (Process(1, 2, 3): Process[Task, Int]).runLog.run
res1: IndexedSeq[Int] = Vector(1, 2, 3)
或者:
scala> Process(1, 2, 3).flatMap(i => Process.fill(3)(i)).runLog.run
res2: IndexedSeq[Int] = Vector(1, 1, 1, 2, 2, 2, 3, 3, 3)
我同意错误有点令人困惑,但在正常使用情况下,您通常不会遇到这种情况,因为您将在上下文中使用该过程,将其类型修改为类似Process[Task, Int]
。
答案 1 :(得分:1)
在Process0[O]
Process(1, 2, 3)
.toSource
上,您可以致电Process[Task, O]
以将其转换为runLog.run
和toList
,或者您可以直接调用函数比如toVector
,{{1}}等,以获得结果。