2015-08-19 61 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