我开始使用 Scalaz 7 验证和/或析取来处理可能失败的操作列表并管理其结果。
这种用例有两个很好的记录案例:
1/你想检查某件事情的条件列表,并累积每个错误(如果有的话)。在这里,你总是走到列表的末尾,如果有任何错误,你将失败作为全局结果。这是一个应用仿函数在起作用。
2/ 您希望执行几个可能失败的步骤,并在第一个步骤失败时停止。在这里,我们有一个monad,它在Scala中很好理解。
因此,我还有另外两个用例,它们在同一行中,但似乎与任何先例都不太吻合:我想处理一系列步骤,可能会失败,并累积错误和成功结果(例如:这是一个文件修改列表,错误可能会发生,因为这是外部世界,成功是我想保留的补丁)。
这两个用例的区别仅在于我想早点停止(在第一个错误时)或者转到列表的末尾。
好的,那么正确的做法是什么?
(写这个问题让我觉得这只是一个简单的折叠,是吗?我会让这个问题在这里验证,如果有人想知道的话)
您需要的是大致将或[E,A]
转换为写入器[List[E],A]
。Writer
monad记录您遇到的错误。
我会这样做:
scala> List(1.success[String], 2.success[String], "3".failure[Int], "4".failure[Int]).partition(_.isSuccess)
res2: (List[scalaz.Validation[java.lang.String,Int]], List[scalaz.Validation[java.lang.String,Int]]) = (List(Success(1), Success(2)),List(Failure(3), Failure(4)))
scala> val fun = (_:List[Validation[String, Int]]).reduceLeft(_ append _)
fun: List[scalaz.Validation[String,Int]] => scalaz.Validation[String,Int] = <function1>
scala> fun <-: res2 :-> fun
res3: (scalaz.Validation[String,Int], scalaz.Validation[String,Int]) = (Success(3),Failure(34))
UPD:合并 #129 和 #130 后,您可以将乐趣
更改为 (_:List[Validation[String, Int]]).conatenate
或 (_:List[Validation[String, Int]]).suml
或bimap
如下:
scala> List(1.success[String], 2.success[String], "3".failure[Int], "4".failure[Int]).partition(_.isSuccess).bimap(_.suml, _.suml)
res6: (scalaz.Validation[java.lang.String,Int], scalaz.Validation[java.lang.String,Int]) = (Success(3),Failure(34))
请查看验证#append
或其别名校验|
。给定两次验证,如果都成功,则返回所附加值的成功。如果两者都失败,则返回附加值的失败。否则,它将返回成功值。这需要成功类型的隐式半群实例。
假设我有几个case类和函数来测试它们: 现在我定义了一个新的case类< code>Person和一个测试函数,它很快就会失败。 现在,我希望函数累积错误,而不是快速失败。 我希望 始终执行所有这些 函数并返回 。我该怎么做?
问题内容: 我有一个看起来像这样的表: 我想添加一个新的列,称为cumulative_sum,因此表如下所示: 是否有可以轻松完成此操作的MySQL更新语句?做到这一点的最佳方法是什么? 问题答案: 如果性能是一个问题,则可以使用MySQL变量: 或者,您可以删除该列并在每个查询中对其进行计算: 这以运行方式计算运行总和:)
问题内容: 我正在尝试做的事情的广泛视角是,在预订系统被预订之日,找出整个系统中尚未进行的预订。这意味着计算存在的所有记录的数量,这些记录的后缀等于(或等于),按分组。请参阅以下假设示例,以获得更好的解释: 我想要结果: 但是我对如何构造查询完全不满意。有小费吗?谢谢! 编辑:为明确起见,number_of_reservations应该是该日期的预订数量,以及该日期之后几天的预订数量。换句话说,n
我想向Web服务并行发送多个请求。结果应该由成功错误收集,然后可以由调用者进一步分析。 问题:我怎样才能收集所有响应,同时也收集在方法中抛出的异常? 我的目标不是返回两个列表:一个包含所有成功的响应,另一个包含错误。
问题内容: 我使用goroutines实现http.Get超时,然后我发现goroutines的数量一直在稳定增长,当达到1000左右时,程序将退出 码: http://play.golang.org/p/SzGTMMmZkI 问题答案: 用1而不是0初始化chan: 并删除关闭并延迟ch的延迟块。 参见:http : //blog.golang.org/go-concurrency-patter
问题内容: 我正在尝试为dellstore2数据库累计计算用户数。在这里和其他论坛上寻找答案时,我使用了这个 这返回 每个月是 看一下前几项,似乎总的来说还不错。但是当我跑步时 对于整个事情,我明白了 这与第一个输出11,681中的最后一项不一致。我猜上面的计算无法确定整个月的唯一性。什么是最快的计算方式(最好不使用自联接)? 问题答案: 除了直接从订单中选择之外,还可以使用如下子查询: 我认为这