【问题标题】:scala flatMap flatten nested listsscala flatMap 展平嵌套列表
【发布时间】:2016-05-25 08:44:21
【问题描述】:

我正在学习 Scala 并解决了 99 个 Scala 问题。对于以下练习:

扁平化嵌套列表结构。 示例:

scala> flatten(List(List(1, 1), 2, List(3, List(5, 8))))
res0: List[Any] = List(1, 1, 2, 3, 5, 8)

解决方案如下

def flatten(ls: List[Any]): List[Any] = ls flatMap {
  case ms: List[_] => flatten(ms)
  case elements => List(elements)
}

但我想知道为什么以下不起作用?

def flatten[A](ls: List[List[A]]): List[A] = ls flatMap {
  case ms: List[_] => flatten(ms)
  case elements => List(elements)
}

IntellJ IDEA 告诉我问题出在 flatten(ms) 部分,它说“无法使用这样的签名解析引用扁平化”,并且在 flattenList 类文档中它说“注意:编译器可能不是能够推断类型参数”。

任何想法为什么第二个代码不起作用?

【问题讨论】:

    标签: scala flatmap


    【解决方案1】:

    其他人提出了不同的问题,但使用了相同的示例。

    我分解每个步骤并解释它here

    【讨论】:

    • 是的,别人就是我!我接受了你非常详细的信息回答,所以谢谢你。但我觉得这是不同的,并没有在那个回复中解释(我没有要求在那里解释)。在这里我问为什么我们不能使用 [A] 来表示这可能是 int 或 char 类型或其他类型。 [A] 语法用于所有其他关于 99 scala 问题的前十个问题,当我测试自己时,我发现很难阻止自己在此示例中使用 [A],但我需要这样做是错误的。但如果我知道为什么错了,我可能会发现不尝试使用 [A] 会更自然。
    【解决方案2】:

    因为解包的最后一步会失败?您将拥有List(elements),而flatten 的第二个版本需要在List 中提供List

    【讨论】: