haskell - Haskell 函数 `seq` 的名称从何而来?
问题描述
我知道它seq
用于通过避免不必要的懒惰来提高性能。我只想知道名字是从哪里来的?它来自“顺序”还是“顺序”?该名称与严格评估有何关系?
解决方案
它来自序列点。这是 C 中众所周知的概念,它确实与seq
Haskell 中的运算符非常相似:左侧的每个计算都应该在右侧的任何计算之前完成。
当然,Haskell的要求要低一些:它只是要求在评估右侧的结果之前将seq
左侧的事物评估为弱头范式。而且它根本不保证任何特定的评估顺序†</sup>,只是如果左边的表达式是⊥,那么右边的表达式不能被评估。
参见pseq
或deepseq
寻找更强大的替代方案,这些替代方案更接近 C 所称的序列点。
†</sup>实际上,C 或 C++ 序列点也不保证计算顺序,只保证任何副作用的顺序正确。但是,在 C 中,副作用无处不在,因此除了低级优化之外,您通常可以假设序列点顺序会得到支持,而 GHC 实际上会经常抛弃seq
s,只要它知道表达式不发散。
推荐阅读
- python - 部分芹菜任务未执行
- javascript - 如何使用 javascript 将一些 div 元素放入主 div 元素中?
- c# - 确定图表区域的最终宽度
- node.js - 如何在不删除当前文件和资产的情况下使用 github 操作部署 Nodejs API
- java - Java:如何使用“Java MP3 ID3 标签库”或 jaudiotagger 获取 mp3 文件的封面图像文件名
- mysql - 如何连接到我的 phpmysql 登录页面
- javascript - 如何从数组创建对象并计算新对象中的值?
- javascript - Azure Application Insight 会显示 JavaScript 错误吗?
- python - 从 Python 中的 API 结果中捕获字符串
- java - 我应该如何在 Apache Ignite (GridGain) 中执行缓存配置迁移?