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

时间:2015-06-24 06:23:53

标签: scala scalaz applicative traversable

我想我明白sequence是什么。我想知道为什么它不适用于List[ValidationNel]。例如:

sequenceList[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可以使用它?

2 个答案:

答案 0 :(得分:9)

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

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

尝试

type X = ValidationNel[String,X]

vs.sequence[X, Int]

vs.sequence[({type l[A]=ValidationNel[String,A]})#l,Int]

答案 1 :(得分:0)

不是Scalaz的专家。

简而言之,因为ValidationNel不是monad,所以此转换有效:

  

列表[ValidationNel [SomeType]] =&gt; ValidationNel [列表[SOMETYPE]]

,因为错误消息显示:implicit value not found,表示没有此类转换。