【发布时间】:2021-02-11 21:12:33
【问题描述】:
我有一个编码草稿,只要它提供正确的答案,它就可以工作。但从美学方面来说,它可以改进,我猜!
目标:在许多可能的解决方案列表中找到第一个解决方案。当找到第一个解决方案时,不要进一步计算。在实际应用中,每个解/非解的计算肯定会更复杂。
不喜欢:Solution=Left 和 NoSolution=Right 别名是反直觉的,因为 Right 通常代表成功,这里 Left 和 Right 被交换(因为在技术上使用 @ 987654327@ 仅Left 快捷方式理解列表)
有没有改进这个实现的好方法?还是其他解决方案?
package playground
object Test {
def main(args: Array[String]): Unit = {
test
}
val Solution = Left
val NoSolution = Right
def test: Unit = {
{
// Find the first solution in a list of computations and print it out
val result = for {
_ <- if (1 == 2) Solution("impossible") else NoSolution()
_ <- NoSolution()
_ <- NoSolution(3)
_ <- Solution("*** Solution 1 ***")
_ <- NoSolution("oh no")
_ <- Solution("*** Solution 2 ***")
x <- NoSolution("no, no")
} yield x
if (result.isLeft)
println(result.merge) // Prints: *** Solution 1 ***
}
}
}
【问题讨论】:
-
这样的事情怎么样:
data.iterator.map(computeSolution).collecFirst { case Right(solution) => solution }其中data是要传递给computeSolution的输入的列表,它将返回Either。这样做的坏处是,如果全部失败,我们就会丢失错误消息。 -
您的问题和代码有点令人困惑。您说目标是“在许多可能的列表中找到第一个解决方案...” 但您的代码中没有
List。现实世界的解决方案是否已经以反向Either格式包装,或者只是为了for理解而添加的?如果是后者,每个“解决方案”如何测试Left/Right分配?如果没有找到正确的解决方案,则发布的代码不会执行任何操作。这是期望的行为吗?Either结果的NoSolution一侧是否有任何值得保留/报告的内容? -
@jwvh:“代码中的列表”指的是
for { ... }中的项目;现实世界的问题不会被包裹在一个反向Either中,这只是我找不到更好的建议;解决方案测试例如用于演示的琐碎“1 == 2”(在测试#1中),但可以变大;如果没有找到正确的解决方案,代码什么也不做,因为这是目的; NoSolution 细节不是必需的,因此它们甚至可以完全省略。与第一个异常快捷方式的异常处理程序相比,这里第一个肯定/解决方案应该快捷方式;无需深入研究非解决方案