par*_*tic 7 validation scala scalaz scalaz7
鉴于以下功能:
def foo( a: A ): ValidationNEL[String,Seq[B]] = ...
def bar( b: B ): ValidationNEL[String,C] = ...
Run Code Online (Sandbox Code Playgroud)
我想结合它们来构建一个函数,然后调用foo最终调用bar生成的每个元素Seq,这样得到一个ValidationNEL[String,Seq[C]]:
def fooAndBar( a: A ): ValidationNEL[String,Seq[C]]
Run Code Online (Sandbox Code Playgroud)
Scalaz 7中的文档很短,我找不到任何相关的例子.
在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))
Run Code Online (Sandbox Code Playgroud)
更新:另请参阅无价的Haskellwiki Typeclassopedia