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()
。
因爲... [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
@Jamil但是我們也有'Nil <:List [Nothing] <:List [List [T] ]' – Eastsun
試圖說同樣的事情。也許爲答案添加解釋? – Jamil