将验证与scalaz 7结合使用

时间:2012-08-11 11:04:12

标签: validation scala scalaz scalaz7

鉴于以下功能:

def foo( a: A ): ValidationNEL[String,Seq[B]] = ...

def bar( b: B ): ValidationNEL[String,C] = ...

我想将它们组合起来构建一个函数,该函数调用foo然后最终调用生成的bar中的每个元素上的Seq,以获得ValidationNEL[String,Seq[C]] 1}}:

def fooAndBar( a: A ): ValidationNEL[String,Seq[C]]

Scalaz 7中的文档很短,我找不到任何相关的例子。

2 个答案:

答案 0 :(得分:5)

对B序列进行硬核遍历。请注意,我在这里使用了List,因为Scalaz 7似乎没有Seq的类型类实例,但是如果确实需要的话,编写自己的类型实例应该不会太难。

import scalaz.{ValidationNEL, Traverse, NonEmptyList}
import scalaz.std.list.listInstance
case class A(a: Int)
case class B(b: Int)
case class C(c: Int)

def foo( a: A ): ValidationNEL[String,List[B]] = Validation.success(List(B(1), B(2)))
def bar( b: B ): ValidationNEL[String,C] = Validation.failure(NonEmptyList("error in " + b.b))//Validation.success(C(b.b * 2))

type ValNEL[A] = ValidationNEL[String, A]

def foobar(a: A): ValidationNEL[String, List[C]] =
  foo(a) flatMap { bs =>
    Traverse[List].traverse[ValNEL, B, C](bs)(bar)
  }

val r: scalaz.ValidationNEL[String, List[C]] = foobar(A(3))

更新:另请参阅宝贵的Haskellwiki Typeclassopedia

答案 1 :(得分:1)

使用kleisli查看此要点,使用https://gist.github.com/3240574执行此操作,并使用验证https://gist.github.com/3230464