8

私は次の署名を持つ関数を持っています

def reject[A](errors: List[String]): ValidationNEL[String, A]

これは棄却メソッドであるため、型Aが返されることはありませんが、署名と一致させるために反映する必要があります。次のように目的の結果を得るために、ラムダ型をいじっていました。

errors.map(Failure[String, A](_).liftFailNel).sequence[({type l[a] = ValidationNEL[String, a]})#l, A]

これは、List[A]私の希望するタイプではなく、タイプを使用します(または表示されます)A。私が探している結果を導き出すための標準的な方法はありますか?

4

1 に答える 1

5

errors空である可能性があり、Listタイプの値がないように制約しているためA、これをトータル関数として記述できるとは思いません。この型署名を書くには、空のリストのケースが存在しないふりをして不正行為をする必要があります。

def reject[A](errors: List[String]): ValidationNEL[String, A] =
  Failure(errors.toNel.get) // bad!

編集: Apocalispが指摘したように、空のリストにエラーを導入することで、もちろんこれを完全な関数にすることができます。しかし、私はerrors実行時に計算された場合にのみそれを行います。これは、次のようなばかげたエラーにつながるため、あなたのユースケースではないと思います。

def reject[A](errors: List[String]): ValidationNEL[String, A] =
  Failure(errors.toNel getOrElse NonEmptyList("Error: There were no errors!"))

代わりにを渡してみませんか?errorsおそらくNonEmptyList、コンパイル時に使用するエラーがある場合にのみ、この関数を使用します。

def reject[A](errors: NonEmptyList[String]): ValidationNEL[String, A] =
  Failure(errors)

NonEmptyList.apply次の署名をコピーして(そしてそれに特化してString)、このターサーを使用できるようにすることができます。

def reject[A](h: String, t: String*): ValidationNEL[String, A] =
  Failure(NonEmptyList(h, t: _*))

試してみましょう:

scala> reject("foo", "bar", "baz")
res0: scalaz.package.ValidationNEL[String,Nothing] = Failure(NonEmptyList(foo, bar, baz))
于 2012-09-25T16:53:41.713 に答える