Scalaz 验证忽略 Apply 方法

Scalaz Validation disregard Apply method

    (List("ha", "heh", "hmm") |@| List("?", "!", ".")) {_ +"doeswork"+ _}

returns正确

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

同时

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

returns总是

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

无论您传递给 "unlift" 值的什么函数。 知道为什么吗?

它不会这样做 "invariably"。如果你试过

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

会 return Success(faildoesnotworkfail)。但由于并非所有传递给 |@| 的值都是 Success,因此它没有任何东西可以应用 {_ + "doesnotwork" + _},因为此操作是针对成功案例,而不是针对失败案例。

成功案例是做计算。失败案例只有 return 组合错误消息。如果您尝试对 Failure 进行计算,实际上并没有计算出任何有趣的内容,只有错误摘要被 returned.

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