2011-09-22 82 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

但折叠参数有默认值(身份),他们没有? –