映射Scalaz验证失败

huy*_*hjl 18 scala scalaz

import scalaz._
import Scalaz._

"abc".parseInt
Run Code Online (Sandbox Code Playgroud)

这将返回一个Validation[NumberFormatException, Int].有没有办法可以在故障方面应用函数(例如toString)来获取Validation[String, Int]

Apo*_*isp 19

只要有一个方法<-:,:->MAB[M[_,_], A, B]可以在该地图的左侧和右侧定义一对方法.碰巧是一个bifunctor,所以你可以这样做:M[A, B]Bifunctor[M]Validation

((_:NumberFormatException).toString) <-: "123".parseInt
Run Code Online (Sandbox Code Playgroud)

Scala的类型推断通常从左向右流动,因此实际上更短:

"123".parseInt.<-:(_.toString)
Run Code Online (Sandbox Code Playgroud)

并且需要较少的注释.


Did*_*ont 11

FailProjection上有一个仿函数.所以你可以做到

v.fail.map(f).validation
Run Code Online (Sandbox Code Playgroud)

(无法输入FailProjection,验证以摆脱它)

另外

v.fold(f(_).failure, _.success)
Run Code Online (Sandbox Code Playgroud)

两者都有点冗长.也许更熟悉scalaz的人可以想出更好的东西