haskell - 在 Haskell 中自动插入惰性
问题描述
Haskell 模式匹配通常是严格的,例如,f (x:xs) = ...
需要将输入列表评估为(thunk : thunk)。但有时不需要这样的评估,并且函数可以对某些参数不严格,例如f (x:xs) = 3
.
理想情况下,在这种情况下,我们可以避免评估参数以获得 的行为const 3
,这可以通过无可辩驳的模式来完成:f ~(x:xs) = 3
. 这给我们带来了性能优势和更大的容错能力。
我的问题是:GHC 是否已经通过某种严格分析实现了这种转换?如果您也可以指出我的一些读物,请不胜感激。
解决方案
据我所知,GHC 永远不会做出比程序员指定的更懒惰的东西,即使它可以证明这不会改变术语的语义。当我们可以证明语义没有改变时,我认为没有任何根本原因可以避免改变术语的惰性;我怀疑这更像是一种经验观察,即我们不知道在任何情况下这将是一个非常好的主意。(如果转换会改变语义,我会认为 GHC 做出这种改变是一个错误。)
我想到的只有一个可能的例外,即所谓的“完全懒惰”转换,在 wiki 上有很好的描述。总之,GHC会翻译
\a b -> let c = {- something that doesn't mention b -} in d
至
\a -> let c = {- same thing as before -} in \b -> d
以避免c
每次将参数应用于新的b
. 但在我看来,这种转变更多的是关于记忆而不是懒惰:在我看来,上述两个术语在懒惰/严格方面具有相同的(指称)语义,只是在操作上有所不同。
推荐阅读
- scala - case语句中的Scala未声明变量
- sql-server - SQL Server 使用 Pivot 每年每月统计登录次数
- java - 如何在 IntelliJ-IDEA 中查看默认的 Java 类实现?
- arrays - 内部字符串数组交换
- java - Java 问题 - 方法未定义,即使我已经在包中定义了它
- javascript - refresh vue page with change
- pandas - 如何在 Pandas 中 Groupby 和 Concat 之后分配数据
- node.js - 在 sqlite DB 中存储不和谐频道 ID 的问题
- python - 仅使用字符串 format() 方法的 Python 格式日期
- python - 从字符串中提取相同匹配的多个实例