scala - 在函数中将 List[String] 转换为 ValidationNEL[String, A]

标签 scala types scalaz

我有一个具有以下签名的函数

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/

相关文章:

Scala:复制具有特征的案例类

design-patterns - 静态类型检查的设计模式

javascript - 获取@Media 打印类型的 innerHTML

scala - 使用 Future[Validation[E,A]] 进行理解

scala - 从 Scala 中的映射序列创建所有键的联合的功能方法

image - 使用ImageIO.write的质量下降

scala - 如何迭代 Scalaz 中的树

scala - 使用 Applicative Functor 对选项列表求和

scala - MiniDFSCluster : HDFS triple slash schema extension wrong FS

go - 通过 Golang 中的方法更改类型的基础值