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

scala中的函数编程 – 无限流

发布时间:2020-12-16 18:13:35 所属栏目:安全 来源:网络整理
导读:我正在完成本书的练习和概念: Scala中的函数编程.假设我需要定义一个常量函数,它按给定值返回一个无限流. 这是我的版本: def constant[A](a: A): Stream[A] = Stream.cons(a,constant(a)) 和GitHub的答案: def constant[A](a: A): Stream[A] = { lazy val
我正在完成本书的练习和概念: Scala中的函数编程.假设我需要定义一个常量函数,它按给定值返回一个无限流.

这是我的版本:

def constant[A](a: A): Stream[A] = Stream.cons(a,constant(a))

和GitHub的答案:

def constant[A](a: A): Stream[A] = {
  lazy val tail: Stream[A] = Cons(() => a,() => tail)
  tail
}

评论说后者比前者更有效,因为它只是一个引用自身的对象.
我无法理解这一点,任何帮助都将不胜感激. (抱歉我的英语不好:)

解决方法

假设您定义第一种方式的常量.现在,

constant(something)

这是一个Cons单元格,它引用了懒惰值和常量(某些)

Cons(() => something,() => constant(something))

现在,让我们尝试获得第1000个元素.我们需要评估尾部,因为我们需要比第一个元素更深入.所以,我们执行常量(某些东西),然后我们得到一个看起来像原始的新的Cons单元格:

Cons(() => something,() => constant(something))

我们尝试获得此Stream的第999个元素.这是低效的,因为这个对象与以前的对象相同,所以我们浪费了时间来制作它.我们将继续浪费时间和记忆,制作1000个相同的Cons细胞. (请原谅可怕的画作.)

Graph of first version

现在,定义第二种方式的常量.

constant(something)
{ lazy val self = Cons(something,self); self }

现在,您的Stream只是对自己的引用.获得此Stream的尾部不会创建新的Cons单元格;它只返回原始流(self.tail eq self),这意味着你不浪费任何内存,时间成本下降,因为你也不浪费时间分配和填充内存.

Graph of second version

(编辑:李大同)

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

    推荐文章
      热点阅读