Чому я отримую наступне 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
^
Проект scalaz-stream-sandbox доступний у GitHub. Виконати sbt console
і потім P(1,2,3).run
для вирішення цієї проблеми.
Відповіді:
8 для відповіді № 1Коли ти пишеш Process(1, 2, 3)
, ви отримуєте a Process[Nothing, Int]
Це процес, який не має жодного уявлення про конкретний контекст, проти якого він може робити зовнішні запити. Це означає, що ви можете розглядати його як Process0
, наприклад:
scala> Process(1, 2, 3).toList
res0: List[Int] = List(1, 2, 3)
Це також означає, що ви можете "t run
це, хоча, тому що run потребує "водія" контекст.
З тих пір 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 для відповіді № 2
На Process0[O]
люблю Process(1, 2, 3)
Ви можете зателефонувати .toSource
щоб перетворити його на a Process[Task, O]
і runLog.run
або ж ви можете зателефонувати безпосередньо функціям подібно toList
, toVector
і т.д., щоб отримати його результат.