为什么序列不适用于验证列表

Mic*_*ael 1 scala scalaz applicative traversable

我想我明白了什么顺序.我想知道为什么它不起作用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))
Run Code Online (Sandbox Code Playgroud)

......但不起作用 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]]
Run Code Online (Sandbox Code Playgroud)

......但sequenceU 确实有效List[ValidationNel]

scala> vs.sequenceU
res14: scalaz.Validation[scalaz.NonEmptyList[String],List[Int]] = Success(List(1, 2))
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么不sequence一起工作List[ValidationNel]?为什么sequenceU要用它?

mel*_*lps 9

.sequenceU使用Unapply技术派生正确的类型,对于.sequence,您需要手动为其提供类型.

为了让事情更烦人,序列的第一个类型参数需要一个类型参数,它接受一个类型参数而不是两个类似ValidationNel.因此,您可以键入lambda,也可以执行本地类型定义.

尝试

type X = ValidationNel[String,X]

vs.sequence[X, Int]
Run Code Online (Sandbox Code Playgroud)

要么

vs.sequence[({type l[A]=ValidationNel[String,A]})#l,Int]
Run Code Online (Sandbox Code Playgroud)

  • `Option`是1参数类型.编译器知道`sequence`需要一个类型参数`G [_]`.它可以推断出`Option [String]``G`是`Option`,但是对于`ValidationNel [String,Int]`它不知道'G`是什么. (2认同)