加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 功能编程中是否有“折叠折叠”或“找到累加器”的概念

发布时间:2020-12-16 19:10:25 所属栏目:安全 来源:网络整理
导读:标题真的是这样说的迭代收集,同时保持循环之间的状态和基于终止条件的完成迭代,除了简单地运行元素之外,也可能是在命令式编程中完成任何事情的最常见的模式.不过,在我看来,这是一个功能性很强的程序员同意不要谈论的东西,或者至少我从来没有遇到一个成语,或
标题真的是这样说的迭代收集,同时保持循环之间的状态和基于终止条件的完成迭代,除了简单地运行元素之外,也可能是在命令式编程中完成任何事情的最常见的模式.不过,在我看来,这是一个功能性很强的程序员同意不要谈论的东西,或者至少我从来没有遇到一个成语,或者是一个半标点的名字,如地图,折叠,缩小等.

我经常在scala中使用followinig代码:

implicit class FoldWhile[T](private val items :Iterable[T]) extends AnyVal {
    def foldWhile[A](start :A)(until :A=>Boolean)(op :(A,T)=>A) :A = {
        if (until(start)) start
        else {
            var accumulator = start
            items.find{ e => accumulator = op(accumulator,e); until(accumulator) }
            accumulator
        }

    }

}

但它是丑陋的每当我尝试一个更具声明性的方法时,我会有更长的时间,几乎肯定较慢的代码,类似于:

Iterator.iterate((start,items.iterator)){
    case (acc,i) if until(acc) => (acc,i)
    case (acc,i) if i.hasNext => (op(acc,i.next()),i)
    case x => x
}.dropWhile {
    case (acc,i) => !until(acc) && i.hasNext
}.next()._1

(一个更多功能的变体将使用Lists或Streams,但迭代器可以说比将数据转换为Stream更少的开销,因为后者的默认实现方式使用下面的迭代器).

我的问题是:

1)这个概念在函数式编程中是否有一个名称,如果是这样,与实现有关的模式是什么?

2)什么是最好的(即简洁,通用,懒惰和最少的开销)的方法来实现它在scala?

解决方法

这是由scala纯粹主义者皱起眉头,但你可以使用这样的return语句:

def foldWhile[A](zero: A)(until:A => Boolean)(op:  (A,T) => A): A = items.fold(zero) {
      case (a,b) if until(a) => return a
      case (a,b) => op(a,b)
}

或者,如果你是一个皱眉头的人,并且想要一个纯粹的功能性解决方案,没有肮脏的命令式的技巧,你可以使用一些懒惰,像迭代器或流:

items
  .toStream // or .iterator - it doesn't really matter much in this case
  .scanLeft(zero)(op)
  .find(until)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读