为什么序列不适用于验证列表
Why does not sequence work with List of Validations
我想我明白sequence是什么了。我想知道为什么它不适用于 List[ValidationNel]
。例如:
sequence
可与 List[Option]]
配合使用
scala> val os = List(1.some, 2.some)
os: List[Option[Int]] = List(Some(1), Some(2))
scala> os.sequence
res10: Option[List[Int]] = Some(List(1, 2))
...但不适用于 List[ValidationNel]
scala> val vs: List[ValidationNel[String, Int]] = List(Success(1), Success(2))
vs: List[scalaz.ValidationNel[String,Int]] = List(Success(1), Success(2))
scala> vs.sequence
<console>:15: error: could not find implicit value for parameter ev:scalaz.Leibniz.===[scalaz.ValidationNel[String,Int],G[B]]
... 然而 sequenceU
是否 与 List[ValidationNel]
一起工作
scala> vs.sequenceU
res14: scalaz.Validation[scalaz.NonEmptyList[String],List[Int]] = Success(List(1, 2))
我的问题是:为什么 sequence
不能与 List[ValidationNel]
一起使用?为什么 sequenceU
使用它?
不是 Scalaz 专家。
简而言之,因为ValidationNel不是monad,所以这个转换不有效:
List[ValidationNel[SomeType]] => ValidationNel[List[SomeType]]
如错误信息所示:implicit value not found
,表明没有这样的转换。
.sequenceU 使用 Unapply 技术派生出正确的类型,而对于 .sequence 您需要手动为其提供类型。
为了让事情变得更烦人,序列的第一个类型参数需要一个类型参数,它采用一个类型参数而不是两个类型参数,如 ValidationNel。所以你要么输入 lambda,要么做一个本地类型定义。
尝试
type X = ValidationNel[String,X]
vs.sequence[X, Int]
或
vs.sequence[({type l[A]=ValidationNel[String,A]})#l,Int]
我想我明白sequence是什么了。我想知道为什么它不适用于 List[ValidationNel]
。例如:
sequence
可与 List[Option]]
scala> val os = List(1.some, 2.some)
os: List[Option[Int]] = List(Some(1), Some(2))
scala> os.sequence
res10: Option[List[Int]] = Some(List(1, 2))
...但不适用于 List[ValidationNel]
scala> val vs: List[ValidationNel[String, Int]] = List(Success(1), Success(2))
vs: List[scalaz.ValidationNel[String,Int]] = List(Success(1), Success(2))
scala> vs.sequence
<console>:15: error: could not find implicit value for parameter ev:scalaz.Leibniz.===[scalaz.ValidationNel[String,Int],G[B]]
... 然而 sequenceU
是否 与 List[ValidationNel]
scala> vs.sequenceU
res14: scalaz.Validation[scalaz.NonEmptyList[String],List[Int]] = Success(List(1, 2))
我的问题是:为什么 sequence
不能与 List[ValidationNel]
一起使用?为什么 sequenceU
使用它?
不是 Scalaz 专家。
简而言之,因为ValidationNel不是monad,所以这个转换不有效:
List[ValidationNel[SomeType]] => ValidationNel[List[SomeType]]
如错误信息所示:implicit value not found
,表明没有这样的转换。
.sequenceU 使用 Unapply 技术派生出正确的类型,而对于 .sequence 您需要手动为其提供类型。
为了让事情变得更烦人,序列的第一个类型参数需要一个类型参数,它采用一个类型参数而不是两个类型参数,如 ValidationNel。所以你要么输入 lambda,要么做一个本地类型定义。
尝试
type X = ValidationNel[String,X]
vs.sequence[X, Int]
或
vs.sequence[({type l[A]=ValidationNel[String,A]})#l,Int]