def pack[A](l: List[A]):List[List[A]] = {
def _pack(res: List[List[A]], rem: List[A]):List[List[A]] = rem match {
case Nil => res
case h::tail if (res.isEmpty || res.last.head != h) => _pack(res:::List(List(h)), tail)
case h::tail => _pack(res.init:::List(res.last:::List(h)), tail)
}
_pack(List(),l)
}
以上代码将列表元素的连续重复项打包到子列表中。
答案 0 :(得分:3)
内部功能似乎只是设计选择。由于使用了内部函数,因此可以在 pack [A] 范围内关闭整个实现。将 _pack 函数移到外部(这将需要添加一个通用参数)绝对是正确的,但是可以在 pack [A] 范围之外调用它。
这是上述功能的另一种可能的实现方式:
def pack[A](l: List[A]) : List[List[A]] = (l :\ List.empty[List[A]]){
case (e, (acc@(hd::_))::tl) if hd == e => (e::acc)::tl
case (e, acc) => List(e)::acc
}