2017-03-08 47 views
2

我想要学习scalaz验证,并给予这段代码:Scalaz验证NEL mkString

  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。你知道斯卡拉是否提供了格式化NEL的方法吗?

+1

您可能想看看Show类型类http://eed3si9n.com/learning-scalaz/Show.html – michaJlS

+1

好的,谢谢,过去几天我正在通过scalaz,但我不能记住一切:) –

+0

我建议不要使用'Show'类类来处理这种事情,因为'NonEmptyList [String]'已经有一个实例,并且它不会做你想做的事情。一般来说,我只会使用Show来进行调试,而不是将数据呈现给用户。 –

回答

2

一个NonEmptyList只是一个额外的担保(非空)单,让您可以随时安全地以使用方法,如mkString转换一个普通的斯卡拉List

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

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

foldable语法导入通过Foldable实例为NonEmptyList提供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那么通用(尽管在大多数情况下这不太重要)。

+1

谢谢,基本上我在我的代码中实现了它,注意到Show被弃用后,我导入了可折叠的对象,并且看到了隐含的我有权力(是!)将它转换为列表(如果你不知道类似scala你的母语它有时是一个痛苦的屁股与所有implicits :)),所以我做到了!我想回答我的问题,但我不想看起来像arogant,所以我等待,感谢你,现在我知道我最后的解决方案是好的:) –