2017-03-08 4 views
2

iは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を使用することはできません。 scalazがNELをフォーマットするための何らかの方法を提供しているかどうか知っていますか?

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

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

foldable構文:あなたは常に安全にmkStringのようなメソッドを使用するために、通常のスカラListに1を変換することができるようにNonEmptyList

+1

「Show」typeclassを見ることができます。http://eed3si9n.com/learning-scalaz/Show.html – michaJlS

+1

ありがとう、私は過去数日間スカラズを通過していました。すべてを覚えています:) –

+0

'NonEmptyList [String]'は既にインスタンスを持っていて、あなたが望むことをしないので、この種のものには 'Show'型クラスを使わないことをお勧めします。一般的に私はデバッグのためだけに 'Show'を使い、ユーザーにデータを提示するのではありません。 –

答えて

2

は、1つの余分保証(非空虚)とリストだけですインポートは、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より一般的ではないので、効率的です(ほとんどの場合、それほど問題になることはほとんどありません)。

+1

ありがとう、基本的に私は私のコードで実装したことに気づいた後、私はfoldableをインポートし、それを暗黙のうちに私は力を持っていた(ええ!)リストに変換する(あなたがスカラあなたの母国語それは時々すべてのimplicitsとお尻の痛み:))、私はこれをやった!私は私の質問に答えたいと思っていましたが、私は傲慢に見えたくありませんでしたので、私は最後の解決策が良かったことを知っています。 –