Scalaz验证NEL mkString

时间:2017-03-08 09:49:09

标签: scala validation scalaz

我试图学习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的方法吗?

1 个答案:

答案 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,然后使用interspersesuml

import scalaz.NonEmptyList, scalaz.std.string._, scalaz.syntax.foldable._

def formatNel(nel: NonEmptyList[String]): String = nel.list.intersperse("/").suml

对于格式化为字符串之类的东西,我可能会坚持toList.mkString,因为它清晰,熟悉,并且可能更有效,因为它不那么通用比suml(虽然在大多数情况下这不太重要)。