Scalaz 验证 NEL mkString

Scalaz validation NEL mkString

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

A NonEmptyList 只是一个带有额外保证(非空)的列表,所以你总是可以安全地将一个转换为普通的 Scala List 以便使用像 [=14 这样的方法=]:

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

def formatNel(nel: NonEmptyList[String]): String = nel.toList.mkString("/")

foldable 语法导入通过 NonEmptyListFoldable 实例提供 toList 方法。您也可以使用 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 通用(尽管在大多数情况下这不太重要)。