Как выполнить последовательность с кошками Scala без псевдонима типа (см. Herding cats) - PullRequest
0 голосов
/ 24 мая 2018

Я читал Стадные кошки

Последний пример на странице Траверс в списке секвенирования для меня не удался.

вНапример, они делают это: -

scala> List(Right(1): Either[String, Int]).sequence
res5: Either[String,List[Int]] = Right(List(1))
scala> List(Right(1): Either[String, Int], Left("boom"): Either[String, Int]).sequence
res6: Either[String,List[Int]] = Left(boom)

Но когда я пытаюсь, я получаю следующую ошибку: -

scala> import cats._, cats.data._, cats.implicits._
scala> val les = List(Right(3):Either[String,Int], Right(2):Either[String,Int])
scala> les.sequence
<console>:37: error: Cannot prove that Either[String,Int] <:< G[A].
les.sequence
   ^

Но когда я помогаю компилятору с псевдонимом типа, чтобы исправить левыйtype all - это хорошо: -

scala> type XorStr[X] = Either[String,X]
defined type alias XorStr

scala> val les = List(Right(3):XorStr[Int], Right(2):XorStr[Int])
les: List[XorStr[Int]] = List(Right(3), Right(2))

scala> les.sequence
res0: XorStr[List[Int]] = Right(List(3, 2))

Итак, мой вопрос: как мне сделать вывод типа, чтобы сделать правильную вещь, чтобы пример работал, не вводя псевдоним типа?

Я пропустил важный неявный импорт для работы с Either [A, B]?

Спасибо, Карл

1 Ответ

0 голосов
/ 24 мая 2018

В вашем коде отсутствует опция скаляка -Ypartial-unification.

В build.sbt вы должны добавить

scalaVersion := "2.12.6"

libraryDependencies += "org.typelevel" %% "cats-core" % "1.1.0"

scalacOptions += "-Ypartial-unification"

или запустить консоль Scala с помощью команды

scala -Ypartial-unification

http://eed3si9n.com/herding-cats/partial-unification.html

...