【问题标题】:Scalaz Validation disregard Apply methodScalaz验证忽略Apply方法
【发布时间】:2018-03-14 00:20:55
【问题描述】:
    (List("ha", "heh", "hmm") |@| List("?", "!", ".")) {_ +"doeswork"+ _}

正确返回

     res0: List[String] = List(hadoeswork?, hadoeswork!, hadoeswork., hehdoeswork?, hehdoeswork!, hehdoeswork., hmmdoeswork?, hmmdoeswork!, hmmdoeswork.)

同时

    (Validation.failure[String, String]("fail") |@| Validation.failure[String, String]("fail")) {_ +"doesnotwork"+ _}

总是返回

    res1: scalaz.Validation[String,String] = Failure(failfail)

无论您传递什么函数来“解除”这些值。 知道为什么吗?

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    它不会“总是”这样做。如果你尝试过

    ("fail".success[String] |@| "fail".success[String]) {_ +"doesnotwork"+ _}
    

    它将返回Success(faildoesnotworkfail)。但由于不是所有传递给|@| 的值都是Success,所以它没有任何东西可以应用{_ + "doesnotwork" + _},因为这个操作是针对成功情况的,而不是针对失败情况的。

    成功案例是进行计算。失败案例仅返回组合的错误消息。如果您尝试对 Failure 进行计算,实际上不会计算任何有趣的内容,只会返回错误摘要。

    在您的特定情况下,它恰好 似乎 好像该函数适用,因为成功值和失败消息具有相同的类型。但是,在一般情况下,failure 消息的类型甚至不必与传递的函数类型做任何事情,而不是 {_ +"doesnotwork"+ _}。例如,您的 Success 值可以是 Double,然后您可以使用 {(x, y) => math.atan2(y, x)} 代替 {_ +"doesnotwork"+ _},这对于 String-typed Failure-messages 没有任何意义。

    【讨论】:

    • 谢谢安德烈,现在更有意义了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多