首页 > 解决方案 > 为什么在下面的scala代码中使用内部函数,我们不能在没有内部函数的情况下编写它

问题描述

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

上面的代码将列表元素的连续副本打包到子列表中。

标签: scalafunctionfunctional-programmingnested

解决方案


内部功能似乎只是一种设计选择。由于内部函数的使用,可以在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
}

推荐阅读