1

我想我明白什么是序列。我想知道为什么它不适用于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使用它?

4

2 回答 2

9

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

为了让事情更烦人,sequence 的第一个类型参数需要一个类型参数,它需要一个类型参数,而不是像 ValidationNel 那样的两个。所以你要么输入 lambda 它,要么做一个本地类型定义。

尝试

type X = ValidationNel[String,X]

vs.sequence[X, Int]

或者

vs.sequence[({type l[A]=ValidationNel[String,A]})#l,Int]
于 2015-06-24T08:10:55.950 回答
0

不是 Scalaz 的专家。

简而言之,因为 ValidationNel 不是 monad,所以这个转换是无效的:

List[ValidationNel[SomeType]] => ValidationNel[List[SomeType]]

如错误消息所示:implicit value not found,表示没有这样的转换。

于 2015-06-24T06:35:31.130 回答