【问题标题】:Implicit String to Seq[Char] pattern matching fail隐式字符串到 Seq[Char] 模式匹配失败
【发布时间】:2016-02-19 05:29:26
【问题描述】:

警告 - 这是处理 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"))

它可以编译,但是第二个调用不起作用 - 抛出“Match not found 10”我不明白为什么。有一个similar question around that topic 声明,需要显式转换。但是,我觉得我确实有一个方法参数类型的形式。 调试器清楚地指出 d 变量的类型是 WrappedString - 它应该可以完成这项工作。但显然,它没有。

这是怎么回事?

【问题讨论】:

    标签: scala


    【解决方案1】:

    当您传递Seq[Char] 类型的对象时,您的模式匹配仅适用于List[Char] 类型。因此,您永远不会在第一次通话时真正匹配。它编译的原因是 Seq 的匹配并不详尽。然而,List 的内容已经很详尽了。

    更新

    让我指出两点:

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

    【讨论】:

    • 因此,您永远不会在第一次调用时真正匹配 - 这很奇怪,因为它确实有效并产生了有效的输出。这不是一项课程作业——它的公开可用的代码任务,而不是测试他们的平台,而不是实际编码本身。
    • Never 表示从不用于非列表的 Seq。
    猜你喜欢
    • 2010-10-18
    • 2021-09-18
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2018-10-04
    • 2016-01-08
    相关资源
    最近更新 更多