隐式字符串到 seq[char] 模式匹配失败



>警告 - 这是一个处理Codility BinaryGap任务的代码 - 只是为了警告,因为这可能会破坏某些人。

我有一段代码,比如

@tailrec
def count2(max:Int, count:Int, d:Seq[Char]):Int = d match {
  case '1' :: s => count2(Math.max(max, count), 0, s)
  case '0' :: s => count2(max, count+1, s);
  case Nil => max
}

我称之为

println(Solution.count2(0, 0, Seq('1', '0')))
println(Solution.count2(0, 0, "10"))

它可以编译,但是第二个调用不起作用 - 抛出"找不到匹配 10"我不明白为什么。围绕该主题有一个类似的问题,指出需要显式转换。但是,我觉得我确实有一个方法参数类型形式的方法参数类型。调试器明确指出 d 变量的类型是 WrappedString - 它应该完成这项工作。但显然,事实并非如此。

这是怎么回事?

当您传递类型为 Seq[Char] 的对象时,您的模式匹配仅在类型List[Char]上工作。因此,您永远不会在第一次通话时真正匹配。它编译的原因是匹配对于Seq并不详尽。然而,对于List来说,它是详尽无遗的。

更新

让我指出两件事:

  1. Seq的默认构造函数生成一个List。所以第一个例子"有效"。
  2. 您给出的String可以隐式转换为Seq[Char]但它不是List!因此,它将为您提供匹配错误。

最新更新