gpt4 book ai didi

scala - 用于理解中的任一值的模式匹配?

转载 作者:行者123 更新时间:2023-12-04 11:46:58 24 4
gpt4 key购买 nike

我有这样的理解:

for {
(value1: String, value2: String, value3: String) <- getConfigs(args)
// more stuff using those values
}
getConfigs返回 Either[Throwable, (Seq[String], String, String)]当我尝试编译时,出现此错误:
value withFilter is not a member of Either[Throwable,(Seq[String], String, String)]

如何在理解中使用此方法(返回 Either )?

最佳答案

像这样:

for {
tuple <- getConfigs()
} println(tuple)

除了开玩笑,我认为这是一个有趣的问题,但它的名称有点错误。
问题(见上文)不是 for comprehensions 是不可能的,而是 for comprehension 中的模式匹配在 Either 中是不可能的。 .

documentation how for comprehensions are translated但它们并不涵盖每种情况。就我所见,这里没有涵盖这一点。所以我在我的“Scala 编程”实例中查找了它——第二版(因为那是我身边的枯树)。

第 23.4 节 - for 表达式的翻译

有一个子章节“在生成器中翻译模式”,这就是这里的问题,如上所述。它列出了两种情况:

案例一:元组

正是我们的情况:
for ((x1, …, xn) <- expr1) yield expr2

应该翻译成 expr1.map { case (x1, …, xn) => expr2) .
这正是 IntelliJ 所做的,当您选择代码并执行“Desugar for comprehension”操作时。好极了!
……但这在我看来更奇怪了,因为脱糖后的代码实际上运行起来没有问题。

所以这个案例是(恕我直言)与案例匹配的案例,但不是正在发生的事情。至少不是我们观察到的。嗯?!

案例二:任意模式
for (pat <- expr1) yield expr2

翻译成
expr1 withFilter {
case pat => true
case _ => false
} map {
case pat => expr2
}

现在有一个 withFilter方法!
这个案例完全解释了错误信息以及为什么 Either 中的模式匹配不可能。

本章终指 the scala language specification (虽然是一个较旧的),这就是我现在停下来的地方。

所以很抱歉我不能完全回答这个问题,但希望我能在这里暗示足够的问题的根源。

直觉

那么为什么是 Either有问题并且不建议 withFilter方法,其中 TryOption做?
因为 filter从“容器”和可能“所有”中删除元素,所以我们需要一些代表“空容器”的东西。

这对 Option 来说很容易,这显然是 None .也很容易,例如 List .对 Try 来说没那么容易,因为有多个 Failure ,每个人都可以持有一个特定的异常。然而,这个地方有多个失败:
  • NoSuchElementException
  • UnsupportedOperationException

  • 这就是为什么 Try[X]运行,但 Either[Throwable, X]才不是。
    这几乎是同一件事,但不完全相同。 Try知道 LeftThrowable图书馆作者可以利用它。

    但是在 Either 上(现在是右偏)“空”案例是 Left案件;这是通用的。因此用户可以确定它是哪种类型,因此库作者无法为每个可能的左侧选择通用实例。

    我想这就是为什么 Either不提供 withFilter开箱即用以及您的表达式失败的原因。

    顺便提一句。这
    expr1.map { case (x1, …, xn)  => expr2) }

    case 有效,因为它会抛出 MatchError在调用堆栈上,并从问题中 panic ……这本身可能是一个更大的问题。

    哦,对于那些足够勇敢的人:直到现在我还没有使用“Monad”这个词,因为 Scala 没有它的数据结构,但是 for-comprehensions 没有它就可以工作。但也许引用不会受到伤害: Additive Monads有这个“零”值,这正是 Either错过了这里以及我试图在“直觉”部分赋予一些意义的东西。

    关于scala - 用于理解中的任一值的模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014563/

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