2011-09-22 12 views
18
import scalaz._ 
import Scalaz._ 

"abc".parseInt 

これはValidation[NumberFormatException, Int]を返します。 toStringなどの障害側の機能を適用してValidation[String, Int]を取得する方法はありますか?Scalazでの検証検証エラー

答えて

19

より良い何かを思い付くことができます。あなたがこれを行うことができますのでValidationは、bifunctorであることを起こる:

((_:NumberFormatException).toString) <-: "123".parseInt 

Scalaの型推論は、一般的に、左から右に流れ、これは実際には短いです:

"123".parseInt.<-:(_.toString) 

少なく注釈が必要です。

+0

ニース。 def Bimap [C、D](最初はA => C =アイデンティティ[A] \ _、2番目:B => D =アイデンティティ[B] \ _)(暗黙のb :Bifunctor [M]):M [C、D] = b.bimap(value、first、second)。だから私たちは "123"を得る.parseInt.bimap(\ _。toString) –

+0

それはすばらしいだろう。プルリクエストを送信します。 – Apocalisp

11

FailProjectionにはファンクタがあります。だから、少し冗長

v.fail.map(f).validation 

(それから抜け出すためにFailProjection、検証として入力しない)

また

v.fold(f(_).failure, _.success) 

両方を行うことができます。たぶんscalazに慣れて誰かがいる限りBifunctor[M]があるとして任意のM[A, B]の左側と右側のマップMAB[M[_,_], A, B]に定義されたメソッド<-::->のペアがあり

+0

は、 'f"と "Failure"が動作しないようにすることができます: '' 123 ".parseInt.fold(_。toString andThen Failure)'はタイプミスマッチを出力します。他の1つは正常に動作します。 – huynhjl

+1

@huynhjl:foldは2つの関数をとります。エラーケースの最初のもの、成功のケースの2番目のものです。 v.fold(_。toString.fail、_.success)は機能します –

+0

fold引数にはデフォルト値(ID)がありますか? –