scala - 为什么在下面的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)
}
上面的代码将列表元素的连续副本打包到子列表中。
解决方案
内部功能似乎只是一种设计选择。由于内部函数的使用,可以在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
}
推荐阅读
- firebase - 批量写入 Firestore 的最大大小(以 MB 为单位)是多少
- java - ServletContext 无法通过将其作为 Spring MVC 中的参数传递来注入
- c++ - C ++:在另一个类中初始化参数化类的对象
- javascript - 如何通过 Ajax 将视图模型发送到控制器
- php - 我构建的 PHP 代码并不能适用于所有场景,它有什么问题?
- c++ - 继承和嵌套类
- python - 切片后如何将稀疏矩阵的新索引映射到旧索引?
- javascript - 每秒运行一次时间更新
- php - Googlebot 使用 GET 请求敲击格式错误的 URL
- solidity - Solidity 合约中的数学运算