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

4

1 に答える 1