Scalaz验证无视Apply方法

时间:2018-03-14 00:20:56

标签: scala scalaz

    (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)

你传递的任何功能“解除”价值。 知道为什么吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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