(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)
你传递的任何功能“解除”价值。 知道为什么吗?
答案 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
- 消息。