当前位置 : 首页 » 互动问答 » 正文

结合Seq [ValidatedNel]的有效值

分类 : 互动问答 | 发布时间 : 2018-04-27 16:13:51 | 评论 : 1 | 浏览 : 45 | 喜欢 : 0

我有以下情况:

 case class MyString(str:String)

val val1:ValidatedNel [String,MyString] = MyString(“valid1”)。validNel
val val2:ValidatedNel [String,MyString] = MyString(“valid2”)。validNel
val val3:ValidatedNel [String,MyString] =“invalid”.invalidNel
val vals = Seq(val1,val2,val3)
// vals:Seq [cats.data.Validated [cats.data.NonEmptyList [String],MyString]] = List(Valid(MyString(valid)),Invalid(NonEmptyList(invalid)))

最后我想能够做一个match的结果,并得到任何和所有错误或所有有效值序列。

我的问题是如何转换序列[验证[NonEmptyList [字符串],MyString中]] into 验证[NonEmptyList [字符串],SEQ [MyString中]]]

所以,我的第一遍是实施Semigroup for 序号[MyString中] :

隐式VAL myStringsAdditionSemigroup:Semigroup [Seq [MyString]] =新的半群[Seq [MyString]] {
  def combine(x:Seq [MyString],y:Seq [MyString]):Seq [MyString] = x ++ y
}

...工作:

 Seq(val1,val2).map(_。map(Seq(_)))。reduce(_ | + | _)
// RES0:cats.data.Validated [cats.data.NonEmptyList [字符串],SEQ [MyString中] =有效(列表(MyString的(valid1),MyString的(valid2)))

,但我需要通过将所有有效值包装在Seq中来准备我的数据......这感觉很奇怪。那么,也许有更好的方法呢?

回答(1)

  • 1楼
  • 如果你使用Seq, like Vector or List, you can sequence it.

    sequence以外的任何东西,基本上会把一个类型构造函数从里面转出来。意义转向F[G[A]] into an G[F[A]]。为此,F需要是Traverse and the G需要是 Applicative . Luckily, Validated is an Applicative and List or VectorTraverse.

    的实例所以最后你的代码应该看起来像这样:< notranslate> import cats.implicits._ val validatedList:Validated [NonEmptyList [String],List [MyString]]] =   vals.sequence

    :如果这不能为你编译,你可能需要启用

    Note partial-unification 启用.

    最简单的方法是添加 sbt -partial-unification partial-unification 如果你在Scala 2.11.9或更新的版本,你也可以简单地添加编译器标志: plugin.

    scalacOptions + =“ - Yialial-unification”

    我们来自

    团队强烈建议您在使用猫时始终拥有此标志,因为它使所有事情变得更容易。cats team strongly encourage you to have this flag on at all times when using cats, as it makes everything just a lot easier.

相关阅读: