Seq [Char]模式匹配的隐式字符串失败

时间:2016-02-18 20:21:10

标签: scala

警告 - 这是一个处理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"我无法理解为什么。有similar question around that topic表示需要进行显式转换。但是,我觉得我确实有一个方法参数类型的形式。 调试器清楚地声明d变量是WrappedString类型 - 它应该完成这项工作。但显然,它没有。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

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

<强>更新

让我指出两件事:

  1. Seq的默认构造函数生成List。所以第一个例子&#34;起作用。&#34;
  2. 您提供的String可隐式转换为Seq[Char],但不是List!因此,它会给你你的匹配错误。