Scalaz Validation 失败时的映射

18
import scalaz._
import Scalaz._

"abc".parseInt
这将返回一个Validation[NumberFormatException, Int]。 是否有办法在失败的一侧应用一个函数(比如toString),以获得一个Validation[String, Int]
2个回答

19

MAB[M[_,_], A, B]上定义了一对方法<-::->,只要有一个Bifunctor[M]就可以将其映射到任何M[A, B]的左侧和右侧。 Validation正好是一个bifunctor,所以你可以这样做:

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

Scala的类型推断通常从左到右进行,因此这实际上更短:

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

并且需要较少的注释。


不错。我想知道以下内容是否在MAB中有用:def bimap[C,D](first:A => C = identity [A] \ _,second:B => D = identity [B] \ _)(implicit b:Bifunctor [M]):M [C,D] = b.bimap(value,first,second)。所以我们得到“123”。parseInt.bimap(\ _。toString) - Didier Dupont
那将是非常棒的。发送一个拉取请求吧。 - Apocalisp

11

在FailProjection上有一个函数对象(functor),因此您可以执行以下操作:

v.fail.map(f).validation

(打成 FailProjection,验证无法脱离)

或者

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

有点啰嗦。或许熟悉scalaz更多的人可以想出更好的方法。


无法让 f andthen Failure 正常工作: "123".parseInt.fold(_.toString andThen Failure) 打印出 类型不匹配。另一个可以正常工作。 - huynhjl
1
@huynhjl:fold 函数接受两个参数:第一个是处理错误情况的函数,第二个是处理成功情况的函数。v.fold(_.toString.fail, _.success) 可以运行。 - Arjan Blokzijl
但是折叠参数有默认值(身份),不是吗? - Didier Dupont
@Apocalisp。谢谢。现在我得找到故障定义的地方 :-) - Didier Dupont
foldArguments有默认值:好的,但这里不是合适的值,恒等式并不是我们想要的。 - Didier Dupont
.failure和.success在Identity上定义,就像大多数适用于类型*的其他内容一样。 - Apocalisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接