当前位置: 首页 > news >正文

Programming language theory 编程语言理论-03-惰性求值 Lazy Evaluation

编程语言理论系列

Programming language theory 编程语言理论-01-overview 概览

Programming language theory 编程语言理论-02-求值策略 Evaluation strategy

Programming language theory 编程语言理论-03-及早求值(英语:Eager evaluation)又译热切求值,也被称为贪婪求值(Greedy evaluation)

Programming language theory 编程语言理论-03-惰性求值 Lazy Evaluation

Programming language theory 编程语言理论-03-短路求值(Short-circuit evaluation; minimal evaluation; McCarthy evaluation; 又称最小化求值)

Programming language theory 编程语言理论-04-组合子逻辑

Programming language theory 编程语言理论-05-curring 柯里化

Programming language theory 编程语言理论-06-λ演算(英语:lambda calculus,λ-calculus)

惰性求值

在编程语言理论中,惰性求值(英语:Lazy Evaluation),又译为惰性计算、懒惰求值,也称为传需求调用(call-by-need),是计算机编程中的一个概念,目的是要最小化计算机要做的工作。

惰性计算的最重要的好处是它可以在空间复杂度上得到极大的优化,从而可以轻易构造一个无限大的数据类型。

惰性求值的相反是及早求值,这是一个大多数编程语言,如C语言,所使用的缺省计算方式。

由于翻译问题,该词在不同语境下有两个相关而又有区别的含意,可以表示为“延迟求值”和“最小化求值”,本条目主要内容为延迟求值,后者请参见最小化计算条目。

延迟求值

延迟求值特别用于匿名式函数编程,在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值,也就是说,语句如x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式被计算并把结果放置到x中,但是先不管实际在x中的是什么,直到通过后面的表达式中到x的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。

某些编程语言默认进行惰性求值(如Miranda和Haskell),另一些语言提供函数或特殊语法来延迟求值(如Scheme的delay或force)。

延迟求值的一个好处是能够建立可计算的无限列表而没有妨碍计算的无限循环或大小问题

例如,可以建立生成无限斐波那契数列表的函数(经常叫做“流”)。

第n个斐波那契数的计算仅是从这个无限列表上提取出这个元素,它只要求计算这个列表的前n个成员。

例如,在Haskell中,斐波纳契数的列表可以写为

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

在Haskell语法中,":"向列表头部添加一个元素,tail返回去掉第一个元素的一个列表,而zipWith使用指定的函数(这里是加法)来组合两个列表的对应元素生成第三个列表。

假定编程者是仔细的,只有生成特定结果所需要的值才被求值。

但是特定计算可能导致程序尝试对无限数目个元素进行求值;例如,求列表的长度或使用fold运算对列表的元素求和将导致程序不能终止或耗尽内存。


http://www.mrgr.cn/news/69057.html

相关文章:

  • 【汇编语言】更灵活的定位内存地址的方法(一)—— 字符操作:and与or指令、ASCII码及大小写转换
  • 【测试框架篇】单元测试框架pytest(2):用例编写
  • 一、HTML
  • 基于RK3568+FPGA的1U/2U电力通讯管理机电力网关解决方案
  • uni-app移动端与PC端兼容预览PDF文件
  • 常用List工具类(取交集、并集等等)
  • 代码随想录算法训练营Day13 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代、层序遍历
  • Kafka经典面试题
  • 前端必知必会-JavaScript 数组属性和方法
  • JDBC学习记录
  • 【万方数据】protobuf 逆向
  • jdk 1.8新特性--接口增强
  • Node.js 常用工具util、文件系统使用介绍 (基础介绍 七)
  • C语言多维数组抽象理解:切格子思维
  • Go 中的泛型,日常如何使用
  • D63【python 接口自动化学习】- python基础之数据库
  • 随身 WiFi 锁频段、频点和小区提升网速
  • 24-11-9-读书笔记(三十二)-《契诃夫文集》(六)上([俄] 契诃夫 [译] 汝龙)药品是甜的,真理是美的,咖啡是苦的,生活是什么啊?
  • Linux 零拷贝技术
  • VScode中使用Cmake遇到的问题及其解决方法[最全+亲测有效]
  • 食品加工厂废水处理设备结构与功能
  • 【梯度下降法优化】随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam
  • Chromium 中chrome.tabs扩展接口定义c++
  • 青少年编程与数学 02-003 Go语言网络编程 19课题、Go语言Restful编程
  • 自动驾驶系列—DAI起步提醒功能:让你不再错过每一个绿灯
  • C++入门基础(二)