「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()
。