Как применить функцию последовательности к списку ValidatedNel у кошек? - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий код

sealed trait DomainValidation {
  def errorMessage: String
}
type ValidationResult[A] = ValidatedNel[DomainValidation, A]
val ai:ValidationResult[String] = "big".validNel
val bi:ValidationResult[String] = "leboski".validNel
val l = List(ai,bi)

Я хочу конвертировать l в ValidationResult[List[String]]. Я сталкивался с функциональностью sequence, но я не могу использовать кошек sequence, так как там должно быть какое-то скрытое, которое знает, как обращаться с ValidationResult[A]. Но я не могу понять, что именно нужно. Я написал следующее

object helper {
  implicit class hello[A](l: List[ValidationResult[A]]) {
    def mysequence: ValidationResult[List[A]] = {
     val m = l.collect { case Invalid(a) => Invalid(a) }
     if (m.isEmpty) l.map { case Valid(a) => a }.validNel
     else /* merge the NonEmpty Lists */
    }
  }
}

Я могу сделать l.mysequence. Но как мне использовать кошек sequence.

PS: я начинающий скала. Трудно учиться :). Простите за любые неправильные упоминания.

1 Ответ

0 голосов
/ 11 января 2019

В Scala 2.12 должно работать следующее:

import cats.data.ValidatedNel, cats.syntax.validated._

// Your code:
sealed trait DomainValidation {
  def errorMessage: String
}
type ValidationResult[A] = ValidatedNel[DomainValidation, A]
val ai:ValidationResult[String] = "big".validNel
val bi:ValidationResult[String] = "leboski".validNel
val l = List(ai,bi)

А потом:

scala> import cats.instances.list._, cats.syntax.traverse._
import cats.instances.list._
import cats.syntax.traverse._

scala> l.sequence
res0: ValidationResult[List[String]] = Valid(List(big, leboski))

Вы не показываете свой код и не объясняете, что не работает, поэтому трудно диагностировать вашу проблему, но это может быть одной из следующих проблем:

  1. Вы находитесь на Scala 2.11, где .sequence требует, чтобы вы включили -Ypartial-unification в настройках вашего компилятора. Если вы используете sbt, вы можете сделать это, добавив scalacOptions += "-Ypartial-unification" к вашему build.sbt (при условии, что вы на 2.11.9 +).
  2. Вы пропустили один из необходимых импортов. Вам нужен как минимум экземпляр Traverse для List и синтаксис для Traverse. Приведенный выше пример кода включает два необходимых вам импорта, или вы можете просто импортировать cats.implicits._ и немного упростить свою жизнь.

Если это не одна из этих двух вещей, вам, вероятно, потребуется включить более подробную информацию в свой вопрос, чтобы мы могли помочь.

...