/ / Запуск процесу скалаз-потоку не дає змоги знайти неявне значення для параметра C: scalaz.Catchable [F2]? - scala, scalaz-stream

Запуск процесу Process scalaz-stream не міг знайти неявне значення для параметра C: scalaz.Catchable [F2]? - скала, скалаз-потік

Чому я отримую наступне 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 і т.д., щоб отримати його результат.