【发布时间】:2011-09-22 14:37:25
【问题描述】:
import scalaz._
import Scalaz._
"abc".parseInt
这将返回一个Validation[NumberFormatException, Int]。
有没有办法可以在失败端应用函数(例如toString)来获得Validation[String, Int]?
【问题讨论】:
import scalaz._
import Scalaz._
"abc".parseInt
这将返回一个Validation[NumberFormatException, Int]。
有没有办法可以在失败端应用函数(例如toString)来获得Validation[String, Int]?
【问题讨论】:
在MAB[M[_,_], A, B] 上定义了一对方法<-: 和:->,只要有Bifunctor[M] 就映射到任何M[A, B] 的左侧和右侧。 Validation 恰好是双函子,所以你可以这样做:
((_:NumberFormatException).toString) <-: "123".parseInt
Scala 的类型推断一般是从左向右流动的,所以这个其实更短:
"123".parseInt.<-:(_.toString)
并且需要更少的注释。
【讨论】:
FailProjection 上有一个仿函数。所以你可以这样做
v.fail.map(f).validation
(无法输入为 FailProjection,验证以摆脱它)
或者
v.fold(f(_).failure, _.success)
两者都有点冗长。也许更熟悉 scalaz 的人可以想出更好的东西
【讨论】:
f andthen Failure 工作:"123".parseInt.fold(_.toString andThen Failure) 打印 type mismatch。另一个工作正常。