アプリで Scalaz 7 Validation を使用しようとしています。しかし、|@|
Applicative functor で失敗を合体させるのに問題があります。ここに私が持っているコードがあります:
type ValidationResult = ValidationNel[String, Unit]
def validate[A: ClassTag](instance: A, fieldNames: Option[Seq[String]] = None): ValidationResult = {
val fields = classTag[A].runtimeClass.getDeclaredFields
val fieldSubset = fieldNames match {
case Some(names) => fields.filter { field => names.contains(field.getName) }
case None => fields
}
fieldSubset.map {
field => field.getAnnotations.toSeq.map {
field.setAccessible(true)
val (name, value) = (field.getName, field.get(instance))
field.setAccessible(false)
annotation => annotation match {
case min: Min => minValidate(name, value, min.value())
case size: Size => sizeValidate(name, value, size.min(), size.max())
}
}
}.flatten[ValidationResult].foldLeft(().successNel[String])(_ |@| _)
}
および関数は単に を返しminValidate
ます。sizeValidate
ValidationResults
問題は、このコードがコンパイルされないことです。エラーメッセージは次のとおりです。
Type mismatch, expected F0.type#M[NotInferedB], actual: ValidationResult
それが何を意味するのかわかりません... Scalaにもっと型情報を与える必要がありますか?
私が達成しようとしているのは、すべてのフィールドが s の場合はそれを返し、それ以外の場合はすべてのs のsuccessNel
組み合わせを返すことです。failureNel
|@|
以前のバージョンの Scalaz から変更されましたか? 私が次のようなことをしても:
().successNel |@| ().successNel
同じエラーが発生します。
アップデート
Scalaz のソースを調べてみたところ、自分の+++
やりたいことを実行しているように見える が見つかりました。
+++
とはどう違い|@|
ますか?