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

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(使用前将#替换为@)

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

  • ANTLR 和 Eclipse(或任何像样的 IDE)

    我已经使用 ANTLRv3IDE 插件在 Eclipse 中使用 ANTLR 一段时间了 虽然它并不完美 而且有点过时 但它的工作相当不错 现在 我希望将我正在创建的另一个 DSL 切换到 ANTLRv4 然而 Eclipse 的支持似乎非
  • SubscriptionManager 用于读取运行 Android 5.1+ 的双 SIM 设备的 IMSI

    对于 API 22 我尝试使用 SubscriptionManager 读取双 SIM 卡 IMSI IMSI 是 14 到 15 个字符 格式如下 MCC MNC MSIN MCC 移动国家 地区代码 例如 美国为 310 MNC 移动网
  • Pandas、大数据、HDF 表以及调用函数时的内存使用情况

    简短的问题 当 Pandas 在 HDFStore 上工作时 例如 mean 或 apply 它是否将内存中的完整数据作为 DataFrame 加载 还是将逐条记录作为 Serie 进行处理 详细描述 我必须处理大型数据文件 并且我可以指定
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr
  • 利用重力效果拖动元素

    我想完成类似于 photoshop com 和此网站的功能 http mrdoob com projects chromeexperiments google gravity http mrdoob com projects chromee
  • iPhone 中的 NSNotification

    我正在将 NSSNotifcation 发送到 iPhone 应用程序中的另一个视图控制器 但它的观察者方法收到两次通知 这可能如何 任何人都可以指导我 我已经使用此代码来发布通知 NSNotificationCenter defaultC
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList
  • 如何将tchar指针转换为char指针

    我想将 tchar 转换为 char 这可能吗 如果是的话该怎么做 我使用unicode设置 A TCHAR要么是一个普通的char or a wchar t取决于您的项目的设置 如果是后者 您需要使用WideCharToMultiByte
  • 在合并的单元格中选择、插入照片并将其居中

    我是一名研发面包师 正在为我的团队制作食谱模板 模板中有照片 但我需要轻松地允许他们单击一个按钮 打开照片的文件选择器 然后将该照片放在合并的单元格中 我其实不太擅长做这个 Sub InsertPhotoMacro Dim photoNam
  • jqGrid刷新本地数据(JSON对象)

    我正在尝试将 jqGrid 与本地数据一起使用 但发现了几个问题 我正在初始化这样的事情 function refreshGrid grid results grid jqGrid data results datatype local c
  • Pymongo 批量插入

    我正在尝试批量插入文档 但批量插入时不会插入超过 84 个文档 给我这个错误 in insert pymongo errors InvalidOperation cannot do an empty bulk insert 是否可以批量插入
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 无法在 Python 2.4 中解码 unicode 字符串

    这是Python 2 4 中的 这是我的情况 我从数据库中提取一个字符串 它包含一个变音的 o xf6 此时 如果我运行 type value 它会返回 str 然后我尝试运行 decode utf 8 但收到错误 utf8 编解码器无法解
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template
  • WiX Heat:预构建事件在构建服务器上过早触发

    我正在为我的 Visual Studio 解决方案收集一个目录 到目前为止 它在我的本地系统上运行可能是因为项目构建顺序得到了尊重 当我在构建服务器上运行安装程序时 它会找到正确的目录 但在构建安装文件时尚未创建该目录 它抛出一个HEAT5

随机推荐