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