2015-08-19 38 views
1

我想创建一个flatten函数,它将获取各种深度的List并将其转换为平面列表。如何在Scala中定义递归列表类型?

例如,对于整数,它可以采取List(1, List(2, 3))并返回List(1, 2, 3)

如何正确声明此函数?

def flatten(list: List[???]): List[T]

+0

所以你希望递归列表的每一个元素都可以是'A'('Int',在这种情况下)或'RecursiveList [A]'? – itsbruce

+0

@itsbruce exactly – Roman

+0

好的。现在,由于你的问题的*标题*是“如何定义一个递归列表类型?”,我想你明白,在创建一个扁平化函数之前,必须创建该类型*。只是你的问题的实际文本没有提到这一点,只是谈论这个功能。会显示如何创建'RecursiveList [A]',然后函数'def flatten [A](xs:RecursiveList [A]):List [A]'的答案成为您想要的吗? – itsbruce

回答

2

看起来你必须使用Any因为列表的深度是未知的。

def flatten(input: List[Any]): List[Any] = 
    input match { 
     case Nil => Nil 
     case head :: tail => 
     head match { 
      case list: List[_] => flatten(list) ::: flatten(tail) 
      case elem => elem :: flatten(tail) 
     } 
    } 

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

如果你想看到几个实施选项检查here和测试here

+0

问题在于它允许输入List(1,“foo”,false),我很确定OP希望所有非列表元素都是相同的类型。 – itsbruce