在Scala中展平任意嵌套的List

在Scala中展平任意嵌套的List

  def flatten(l: List[_]): List[_] = {
    def iflatten(l: List[_], ret: List[_]): List[_] = l match {
      case Nil => ret
      case h :: Nil =>
        if( h.isInstanceOf[List[_]]) { iflatten(h, ret) }
        else {
          l.head :: ret
          iflatten(l.tail, ret)
        }
    }
  }


我知道有多种方法可以做到这一点,但我不是100%肯定我的方法是正确的。我想对其进行测试,但是我遇到的一个问题是在我称之为的第二种情况下:

... { iflatten(h, ret) }

我收到编译器错误:

error: type mismatch;
found   : Unit
required: List[?]


我正在尝试解决这些类型问题,以了解有关类型系统的更多信息,因为它与我过去使用的系统不同。关于为什么编译器抱怨的任何建议将不胜感激。

最佳答案

抱歉,此代码非常复杂。我试图简化它,并获得以下解决方案:

    scala> :paste
    // Entering paste mode (ctrl-D to finish)

        def flatten(l : List[_]) : List[_] = l flatMap {
          case l1 : List[_] => flatten(l1)
          case otherwise => List(otherwise)
        }


    // Exiting paste mode, now interpreting.

    flatten: (l: List[_])List[_]

    scala> flatten(List(1,2,3))
    res3: List[Any] = List(1, 2, 3)

    scala> flatten(List(1,2,List(3,4)))
    res4: List[Any] = List(1, 2, 3, 4)

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


修复代码(将调用添加到iflat)之后,我进行了以下重构:


删除了内部方法
使用内置的flatMap进行迭代(因此可以消除或简化某些case表达式)
instanceOf替换为类型防护


我认为更简单的解决方案是使用shapeless library(提示:寻找“样板”部分)。

关于scala - 在Scala中展平任意嵌套的List,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18454113/

10-13 08:42