2015-11-02 152 views
1

我的工作問題P07的Ninety-Nine Scala Problems匹配類型

P07 (**) Flatten a nested list structure. 
Example: 
scala> flatten(List(List(1, 1), 2, List(3, List(5, 8)))) 
res0: List[Any] = List(1, 1, 2, 3, 5, 8) 

我一個解決方案,最初的嘗試是:

​​

然而,這並不編譯因爲我不允許在第二個case聲明中指定head的類型。有沒有辦法讓我做到這一點?

順便說一句,推薦的解決方案使用flatMap代替match,但我不知道爲什麼它甚至需要在這種情況下,模式匹配...

回答

5

你可以只括號頭的聲明:

def flatten[A](ls : List[A]): List[A] = { 
    def flattenRec[A](ls: List[A], flatList: List[A]): List[A] = ls match { 
    case Nil => flatList 
    case (head: List[A]) :: tail => flattenRec(head, flatList) 
    case head :: tail => flattenRec(tail, flatList :+ head) 
    } 
    flattenRec(ls, List[A]()) 
} 

請注意,您將收到關於未選中類型模式的警告(因爲頭部需要是A的列表,而不是其他任何東西在運行時會由於擦除而丟失),您將需要向自己保證,你可以忽略(或通過涉及的一些hijinkss)。

+0

謝謝,我覺得有點傻不付出努力這一點。 –

0

尼斯的問題,下面的備用方案:

def flatten(a:List[Any]):List[Any] = 
    a.flatMap{ 
     case l:List[Any] => flatten(l) 
     case l => List(l) 
    }