我试图学习scalaz验证,并给出了这段代码:
AuthorValidator.validate(author) match {
case scalaz.Success(authorValidated) => onSuccess(authorService.addAuthor(authorValidated)) { extract: Int =>
complete(StatusCodes.OK -> extract+"")
}
case scalaz.Failure(failure) => complete(StatusCodes.Accepted, failure mkString "/") // this piece won't work
}
}
我想从failure : NonEmptyList[String]
获取格式化字符串。基本上,我不能使用mkString。你知道scalaz是否提供了一些格式化NEL的方法吗?
答案 0 :(得分:2)
NonEmptyList
只是一个额外保证(非空)的列表,因此您可以随时安全地将其转换为普通Scala List
,以便使用mkString
之类的方法:
import scalaz.NonEmptyList, scalaz.syntax.foldable._
def formatNel(nel: NonEmptyList[String]): String = nel.toList.mkString("/")
foldable
语法导入通过toList
Foldable
实例提供NonEmptyList
方法。您也可以使用nel.list.toList
将第一个转换为scalaz.IList
,但这更加冗长,对于大型列表来说可能效率较低(我不知道我不是肯定)。
还有很多其他方法可以直接编写,而无需转换为Scala列表。一种方法是转换为IList
,然后使用intersperse
和suml
:
import scalaz.NonEmptyList, scalaz.std.string._, scalaz.syntax.foldable._
def formatNel(nel: NonEmptyList[String]): String = nel.list.intersperse("/").suml
对于格式化为字符串之类的东西,我可能会坚持toList.mkString
,因为它清晰,熟悉,并且可能更有效,因为它不那么通用比suml
(虽然在大多数情况下这不太重要)。