gpt4 book ai didi

scala - 是否有一种简单的方法可以在 Scala 的嵌套 Seq 中默认越界?

转载 作者:行者123 更新时间:2023-12-04 08:44:30 26 4
gpt4 key购买 nike

我有一个向量的向量,我正在访问它以应用 bool 函数。 IE。
Vector[Vector[T]]我将在那里执行一些类似的事情f(myVector(i)(j))其中 f 的类型为 T => Boolean .

但这不会进行边界检查,而且我无法得到真正优雅的东西。

我可以用 applyOrElse :myVector.applyOrElse(i, (_:Int) => Vector.empty).applyOrElse (j, (_:Int) => defaultT)
哪里f(defaultT)会返回 false但我希望我可以设置一个默认值而不是一个函数。

我可以用lift给我一个Option ,但它在第二层的组合并不好:myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false
这确实有效,但仍然很难阅读。

然后是标准的 if/else 块:

if (myVector.size <= i) false
else {
val myVector2 = levelVector(i)
if (myVector2.size <= j) false
else f(myVector2(j))
}

它似乎应该能够比我能实现的更容易分解。如果我添加第三层,它会变得更丑。

还有其他选择吗?

免责声明:这是改编自coursera的progfun类(class)

最佳答案

从问题中获取以下代码:

myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false

这可以改写如下:
myVector.lift(i).flatMap(_.lift(j)).fold(false)(f)

或者,之前 fold在 Scala 2.10 中引入:
myVector.lift(i).flatMap(_.lift(j)).map(f).getOrElse(false)

关键思想是推迟解包(或映射) Option尽可能长时间。这种方法将很自然地推广到两个以上的维度。

这非常接近于 for -在您的答案中包含 -comprehension(假设您打算在其中包含 lift),但是一旦您必须将理解包含在括号中,我个人倾向于发现脱糖版本更清晰。

关于scala - 是否有一种简单的方法可以在 Scala 的嵌套 Seq 中默认越界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765091/

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