gpt4 book ai didi

scala - 在另一个 monad 中验证的好语法

转载 作者:行者123 更新时间:2023-12-01 13:40:44 28 4
gpt4 key购买 nike

我喜欢 monad 转换器。例如,我可以像这样很好地组合两个 future 的可选值:

val val1:OptionT[Task, Int] = ???
val val2:OptionT[Task, Int] = ???

val sum = for {
one ← val1
two ← val2
} yield (one + two)

因为 Validation 没有 Monad[_] 实例,所以我不能对它使用类似的语法。什么是最好的方法,如何将这两者相加:

val val3:Task[ValidationNel[Throwable,Int]] = ???
val val4:Task[ValidationNel[Throwable,Int]] = ???

最佳答案

您可能正在寻找累积错误或计算结果的方法。您可能对 macculkin operator 感兴趣,我的意思是管道上的管道或 |@|(选择您最喜欢的名称);)

使用示例。查看错误是如何累积的(OMG!Holly mum! 包含在结果中。

import scalaz._
import Scalaz._

val v1: ValidationNel[Throwable, Int] = 1.successNel
val v2: ValidationNel[Throwable, Int] = new RuntimeException("OMG!").failNel
val v3: ValidationNel[Throwable, Int] = new RuntimeException("Holly mom!").failNel

val sum : ValidationNel[Throwable, Int] = (v1 |@| v2 |@| v3 ) (_ + _ + _)
//scala> sum: scalaz.ValidationNel[Throwable,Int] = Failure(NonEmptyList(java.lang.RuntimeException: OMG!, java.lang.RuntimeException: Holly mom!))

经常犯的错误是当您选择使用 for comprehension 或 map 函数时。当您决定遵循这种方式时,您将无法累积错误。只有 OMG! 被累积。见下文:

for( val1 <- v1;
val2 <- v2;
val3 <- v3
) yield(val1 + val2 + val3)

//res0: scalaz.Validation[scalaz.NonEmptyList[Throwable],Int] = Failure(NonEmptyList(java.lang.RuntimeException: OMG!))

关于scala - 在另一个 monad 中验证的好语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19451751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com