我有一个具有以下签名的函数
def reject[A](errors: List[String]): ValidationNEL[String, A]
由于这是一个拒绝方法,类型
A
永远不会被退回,但我需要反射(reflect)它以匹配签名。我正在使用类型 lambdas 来获得我想要的结果,如下所示:errors.map(Failure[String, A](_).liftFailNel).sequence[({type l[a] = ValidationNEL[String, a]})#l, A]
这使用类型
List[A]
(或似乎),而不是我想要的类型 A
.有没有标准的方法来推导出我正在寻找的结果?
最佳答案
因为 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))
关于scala - 在函数中将 List[String] 转换为 ValidationNEL[String, A],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587093/