为什么在下面的Scala代码中使用内部函数,我们不能在没有内部函数的情况下编写它

时间:2018-08-10 07:52:02

标签: scala function functional-programming nested

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

以上代码将列表元素的连续重复项打包到子列表中。

1 个答案:

答案 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
}