2016-02-04 63 views
0

我已經從頭開始編寫了一個將嵌套列表作爲輸入並輸出另一個的扁平函數。如何在scala中替換:::

def flatten[A] (list:List[List[A]]):List[A] 

我用scala的':::'綁定兩個列表,它工作正常。但是,我的練習禁止我使用這個或任何內置方法(從個人Scala書中練習)。

現在,我寫了一個helper方法來合併這兩個名爲merge的列表。

如何合併到一個新版本的函數flatten中?

回答

0

如果你有方法合併可以使用foldLeft爲扁平列表清單:

list.foldLeft(List[A]())(merge) 
0
def merge1[T](l1: List[T], l2: List[T]): List[T] = 
     l1.reverse.foldLeft(l2)((acc, e) => e :: acc) 

    /** for large lists will throws Stackoverflow */ 
    def merge2[T](l1: List[T], l2: List[T]): List[T] = 
     l1.foldRight(l2)((e, acc) => e :: acc) 


    def flatten[A](list: List[List[A]]): List[A] = 
     list.foldLeft(Nil: List[A])(merge1) 

如果你想添加merge方法List類型,你可以寫:

implicit class ListExt[T](l: List[T]) { 
    def merge(l2: List[T]): List[T] = merge1(l, l2) 
    } 


    def flatten2[A](list: List[List[A]]): List[A] = 
    list.foldLeft(Nil: List[A])((acc, e) => acc merge e)