- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Scala,但不明白为什么以下内容不起作用。
我想重构一个(经过测试的)mergeAndCount
函数,它是计数倒置算法的一部分,以利用模式匹配。这是未重构的方法:
def mergeAndCount(b: Vector[Int], c: Vector[Int]): (Int, Vector[Int]) = {
if (b.isEmpty && c.isEmpty)
(0, Vector())
else if (!b.isEmpty && (c.isEmpty || b.head < c.head)) {
val (count, r) = mergeAndCount(b drop 1, c)
(count, b.head +: r)
} else {
val (count, r) = mergeAndCount(b, c drop 1)
(count + b.length, c.head +: r)
}
}
这是我重构的方法 mergeAndCount2
。哪个工作正常。
def mergeAndCount2(b: Vector[Int], c: Vector[Int]): (Int, Vector[Int]) = (b, c) match {
case (Vector(), Vector()) =>
(0, Vector())
case (bh +: br, Vector()) =>
val (count, r) = mergeAndCount2(br, c)
(count, bh +: r)
case (bh +: br, ch +: cr) if bh < ch =>
val (count, r) = mergeAndCount2(br, c)
(count, bh +: r)
case (_, ch +: cr) =>
val (count, r) = mergeAndCount2(b, cr)
(count + b.length, ch +: r)
}
但是如您所见,第二种和第三种情况是重复代码。因此,我想使用这样的析取将它们组合起来:
case (bh +: br, Vector()) | (bh +: br, ch +: cr) if bh < ch =>
val (count, r) = mergeAndCount2(br, c)
(count, bh +: r)
这给了我一个错误(在 case 行):illegal variable in pattern alternative
。
我做错了什么?
非常感谢任何帮助(包括样式)。
更新:感谢您的建议,这里是我的结果:
@tailrec
def mergeAndCount3(b: Vector[Int], c: Vector[Int], acc : (Int, Vector[Int])): (Int, Vector[Int]) = (b, c) match {
case (Vector(), Vector()) =>
acc
case (bh +: br, _) if c.isEmpty || bh < c.head =>
mergeAndCount3(br, c, (acc._1, acc._2 :+ bh))
case (_, ch +: cr) =>
mergeAndCount3(b, cr, (acc._1 + b.length, acc._2 :+ ch))
}
最佳答案
当使用管道符 (|) 进行模式匹配时,您不允许绑定(bind)除通配符 (_) 以外的任何变量。
这很容易理解:在您的case
主体中,bh
或br
的实际类型是什么,例如,如果你的两个备选方案匹配不同的类型?
编辑 - 来自 scala 引用:
8.1.11 Pattern Alternatives Syntax: Pattern ::= Pattern1 { ‘|’ Pattern1 } A pattern alternative p 1 | . . . | p n consists of a number of alternative patterns p i . All alternative patterns are type checked with the expected type of the pattern. They may no bind variables other than wildcards. The alternative pattern matches a value v if at least one its alternatives matches v.
在第一条评论后编辑 - 你可以使用通配符来匹配这样的内容,例如:
try {
...
} catch {
case (_: NullPointerException | _: IllegalArgumentException) => ...
}
关于Scala 模式匹配与析取不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407959/
在 C++ 中实现两个 std::vector 之间的逻辑析取的最优雅的方法是什么? 例如: vector a = {0,1,2,3,4,5,6,7,8,9}; vector b = {0,1,2,3
有人知道如何对空析取进行条件检查吗? Disjunction dis = Restrictions.disjunction(); if(dis) { } 最佳答案 您可以尝试: if(dis == n
我有 3 个不同的模块,每个模块都有自己的错误类型。以下是一个非常简化的版本。 object ModuleA { case class ErrorA(msg: String) def getA
我想知道是否有一种方法可以更方便地格式化测试表达式中的连接。目前它看起来像这样: 如果我想在这里测试大约 10 个元素,那么查找我已经添加的元素非常不方便。 2.0中有类似的东西吗?
为什么?我正在为 Java-Scala 适配器类编写测试。 如何在 Java 中为 \/[String, Int] 创建左右析取? 最佳答案 Scala方法名中的符号其实是有脱糖的,用来在JVM中确定
我一直在研究用于自定义/关系查询的 Parse API,但无法找到创建模拟 AND 析取查询的示例。例如,我想找到一个对象,其“第一”和“最后”列分别匹配值“John”和“Doe”。 PARSE AP
我有以下场景,我必须检查 URL 是否正确构建并提供了一些查询参数。我不希望系统在呈现的 URL 中应用特定的顺序,所以我带来了以下我希望工作的测试用例: it('test that url is b
我是一名优秀的程序员,十分优秀!