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/