2013-10-12 63 views
1

我從「Scala函數式編程原理」開始了「包函數」練習。傳遞清單參數空列表

將連續的重複項放入List[List[T]]

input: List("a", "a", "b", "b", "c", "a") 
output: List(List(a, a), List(b, b), List(c), List(a)) 

鑑於此功能...

def pack[T](xs: List[T]): List[List[T]] = { 
    def go[T](ys: List[T], acc: List[List[T]]) : List[List[T]] = ys match { 
     case Nil => acc 
     case x :: xs_ => val r: List[T] = ys.takeWhile(a => a == x) 
         go(ys.drop(r.length), acc :+ r) 
    } 
    go(xs, List(Nil).filter(_ != Nil)) // *** line in question *** 
} 

有沒有更好的辦法在哪裏List[List[T]]內部列表是空的通過?

如果我沒有filter那裏,pack(...)的結果將是List()

回答

2

爲什麼不只是...........:

go(xs, Nil) 

BTW,還有就是我對於這個問題的解決方案:

def pack[T](xs: List[T], 
      acc: List[List[T]] = Nil): List[List[T]] = 
    (xs, acc) match { 
    case (Nil, _) => acc 
    case (i:+last, (h::t1)::t2) if last == h => pack(i, (last::h::t1)::t2) 
    case (i:+last, acc0) => pack(i, List(last)::acc0) 
    } 

,這裏是另一種解決方案:

def pack[T](xs: List[T]): List[List[T]] = xs match { 
    case Nil => Nil 
    case x::rs => pack(rs) match { 
     case ([email protected]`x`::_)::t => (x::h)::t 
     case t => List(x)::t 
    } 
} 
+0

因爲... [case object Nil extends List \ [Nothing \]](https://github.com/scala/scala/blob/v2.10.2/src/library/scala/collection/immutable/ List.scala#L334)so Nil <:Li st [Nothing] <:List [T]因爲Nothing <:T對於本例中的所有T [列表] [T] – Jamil

+0

@Jamil但是我們也有'Nil <:List [Nothing] <:List [List [T] ]' – Eastsun

+0

試圖說同樣的事情。也許爲答案添加解釋? – Jamil