【问题标题】:Map on Scalaz Validation failureScalaz 验证失败的映射
【发布时间】:2011-09-22 14:37:25
【问题描述】:
import scalaz._
import Scalaz._

"abc".parseInt

这将返回一个Validation[NumberFormatException, Int]。 有没有办法可以在失败端应用函数(例如toString)来获得Validation[String, Int]

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

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

    ((_: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)
    • 那太棒了。发送拉取请求。
    【解决方案2】:

    FailProjection 上有一个仿函数。所以你可以这样做

    v.fail.map(f).validation
    

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

    或者

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

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

    【讨论】:

    • 无法使 f andthen Failure 工作:"123".parseInt.fold(_.toString andThen Failure) 打印 type mismatch。另一个工作正常。
    • @huynhjl: fold 有两个功能:第一个用于错误情况,第二个用于成功情况。 v.fold(_.toString.fail, _.success) 有效
    • 但是折叠参数有默认值(身份)不是吗?
    • @Apocalisp。谢谢。现在我必须找到定义失败的位置:-)
    • foldArguments 有默认值:好的,这里不是正确的,身份不是我们想要的
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多