函数式语言中的部分求值和函数内联有什么区别?

2024-05-23

我知道:

  1. 函数内联就是用函数定义代替函数调用。
  2. 部分评估是在编译时评估程序的已知(静态)部分。

在 C 等命令式语言中,两者之间存在区别,其中运算符与函数不同。但是,在像 Haskell 这样的函数式语言(其中运算符也是函数)中,两者之间有什么区别吗?

两者之间的唯一区别是函数内联可以在程序的选择性部分上执行,而部分评估是在整个程序上执行的(即。 vs )?

两种优化技术之间的语义差异是什么?


之间存在差异

  • 对编译器(甚至预处理器)已知的一组给定运算符和函数求常量表达式,这发生在编译时间。例如。编译器编译print(2*2) as print(4)。正如您似乎暗示的那样,这绝不需要限于运算符表达式(例如print(sqrt(2.0))
  • 部分评估,这是一个更广泛的概念。编译器可以意识到print(myfunc(2))可以转化为print(c) where c是调用的结果myfunc(2)。然后它可以(在“专业化时间") call myfunc(2)确定c。当然,如果myfunc有副作用,例如擦除自己的硬盘而不是程序用户的硬盘。因此,编译器需要某种注释或属性来知道何时允许/需要这种情况(例如 C++11 的常量表达式 http://www.cprogramming.com/c++11/c++11-compile-time-processing-with-constexpr.html)

内联是一个不相关的概念。内联函数调用意味着用被调用函数的主体替换调用。此机构不予评估。

在 C 等命令式语言中,两者之间存在区别,其中运算符与函数不同。但是,在像 Haskell 这样的函数式语言(其中运算符也是函数)中,两者之间有什么区别吗?

这种区别(运算符与函数)纯粹是语法上的,与内联和部分求值之间的差异无关:

函数调用和带有运算符的表达式都可以在 C 中内联和编译时求值。编译时求值仅限于一组固定运算符和函数上的表达式(主要是运算符,但这是历史意外)

这两个概念在 Haskell 中都是有意义且截然不同的。

  • 内联:ghc has {-# INLINE f #-}, where f由于显而易见的原因,不能递归,
  • 部分评估:这通常被概括为超级编译 https://stackoverflow.com/questions/9067545/what-is-supercompilation其中不仅基类型的表达式被转换,甚至函数也被转换,例如转变map f (map g xs) into map (f . g) xs)。它也可以(但不需要)进行内联。哈斯克尔模板 https://www.haskell.org/haskellwiki/Template_Haskell是在编译时(显式)评估程序部分的另一种方法。

因此,您标题问题的答案是:内联和部分求值之间的差异与函数和运算符之间的差异无关,并且在函数语言中与在 C 中大致相同。部分求值在 C 中可能更困难因为副作用(参见上面擦除的硬盘)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数式语言中的部分求值和函数内联有什么区别? 的相关文章

  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm
  • 如何在 Angular 4 中翻译 mat-paginator?

    你知道如何在 Angular 中翻译 每页项目 吗mat paginator标签 这mat paginator是材料设计中的一个元素 您可以使用MatPaginatorIntl为了这 威尔 豪厄尔制作 https github com an
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我
  • 如何在 OSX 上安装 LaTeX .sty 文件?

    我设置了一个 LaTeX 项目 tex documents some file tex support todonotes sty where some file tex uses todonotes usepackage colorinl
  • Android 材料芯片组件崩溃应用程序。无法膨胀 xml

    Tried Chip来自两个支持库的组件 com google android support design 28 0 0 rc01和材料 com google android material material 1 0 0 rc01 堆栈
  • 禁用允许文本选择的

    残疾人可以吗
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐