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

"abc".parseInt 

這將返回Validation[NumberFormatException, Int]。 有沒有一種方法可以在故障端應用功能(例如toString)以獲得Validation[String, Int]斯卡拉茲驗證失敗

回答

19

上有MAB[M[_,_], A, B],只要有一個Bifunctor[M]任何M[A, B]的左側和右側地圖定義的一對方法<-::->Validation恰好是一個bifunctor,所以你可以這樣做:

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

Scala的類型推斷通常由左到右流動,所以這其實是越短:

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

而且需要較少的註解。

+0

不錯。我想知道以下內容可能對MAB有用:def bimap [C,D](first:A => C = identity [A] \ _,second:B => D = identity [B] \ _)(implicit b :Bifunctor [M]):M [C,D] = b.bimap(值,第一,第二)。所以我們得到「123」.parseInt.bimap(\ _。toString) –

+0

那真是太棒了。發送拉請求。 – Apocalisp

11

FailProjection上有一個函子。所以,你可以做

v.fail.map(f).validation 

(無法輸入的FailProjection,驗證,以擺脫它)

或者

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

兩個有點冗長。也許有人更熟悉scalaz能拿出更好的東西

+0

無法獲得'f和失敗'工作:'「123」.parseInt.fold(_。toString和Then Failure)'打印'類型不匹配'。另一個工作正常。 – huynhjl

+1

@huynhjl:fold有兩個功能:第一個是錯誤情況,第二個是成功案例。 v.fold(_。toString.fail,_.success)的作品 –

+0

但摺疊參數有默認值(身份),他們沒有? –