1
我想创建一个flatten
函数,它将获取各种深度的List并将其转换为平面列表。如何在Scala中定义递归列表类型?
例如,对于整数,它可以采取List(1, List(2, 3))
并返回List(1, 2, 3)
。
如何正确声明此函数?
def flatten(list: List[???]): List[T]
我想创建一个flatten
函数,它将获取各种深度的List并将其转换为平面列表。如何在Scala中定义递归列表类型?
例如,对于整数,它可以采取List(1, List(2, 3))
并返回List(1, 2, 3)
。
如何正确声明此函数?
def flatten(list: List[???]): List[T]
看起来你必须使用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)
问题在于它允许输入List(1,“foo”,false),我很确定OP希望所有非列表元素都是相同的类型。 – itsbruce
所以你希望递归列表的每一个元素都可以是'A'('Int',在这种情况下)或'RecursiveList [A]'? – itsbruce
@itsbruce exactly – Roman
好的。现在,由于你的问题的*标题*是“如何定义一个递归列表类型?”,我想你明白,在创建一个扁平化函数之前,必须创建该类型*。只是你的问题的实际文本没有提到这一点,只是谈论这个功能。会显示如何创建'RecursiveList [A]',然后函数'def flatten [A](xs:RecursiveList [A]):List [A]'的答案成为您想要的吗? – itsbruce