2012-09-25 17 views
7

これは拒否方法ですので、私は、タイプAは、次のシグネチャ変換リストValidationNELへの[文字列] [文字列、A]機能で

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

を持つ関数が返されることはありませんでしょうしているが、私は必要署名と一致するように反映されます。私は次のように私の望ましい結果を得るために型ラムダをいじりました:

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

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

答えて

5

errorsが空の場合があり、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) 

あなたはこのterserが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)) 
+0

あなただけ作ることができます空リストにもエラーがあります:) – Apocalisp

+0

それは本当です、私はそれを考えていませんでした。実行時に 'errors'が計算されると便利ですが、コード内にリテラルを書くと仮定しました。私は "おっと、あなたはtehコードでエラーを書くのを忘れてしまった"と疑うのは、実行時に便利なエラーになります。 –

+1

また、「エラー:エラーはありませんでした。 – Apocalisp

関連する問題