2017-03-08 88 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,所以我等待,感謝你,現在我知道我最後的解決方案是好的:) –