7

次の関数が与えられます:

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

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

関数を作成するなど、それらを組み合わせたいと思います。この関数はfoo、最終的barには、生成されたの各要素を呼び出します。たとえば、 :Seqを取得します。ValidationNEL[String,Seq[C]]

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

Scalaz 7のドキュメントは非常に短く、関連する例は見つかりませんでした。

4

2 に答える 2

5

Bシーケンスでハードコアトラバーサルを実行します。Scalaz 7にはの型クラスインスタンスがないように見えるので、ここでListを使用したことに注意してください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))

更新:貴重なHaskellwikiTypeclassopediaも参照してください

于 2012-08-11T12:30:02.503 に答える
1

https://gist.github.com/3240574と検証https://gist.github.com/3230464のいずれかでこれを行うためにkleisliを使用してこの要点を見てください

于 2012-08-11T12:42:24.040 に答える