首页 > 解决方案 > 在 Haskell 中自动插入惰性

问题描述

Haskell 模式匹配通常是严格的,例如,f (x:xs) = ... 需要将输入列表评估为(thunk : thunk)。但有时不需要这样的评估,并且函数可以对某些参数不严格,例如f (x:xs) = 3.

理想情况下,在这种情况下,我们可以避免评估参数以获得 的行为const 3,这可以通过无可辩驳的模式来完成:f ~(x:xs) = 3. 这给我们带来了性能优势和更大的容错能力。

我的问题是:GHC 是否已经通过某种严格分析实现了这种转换?如果您也可以指出我的一些读物,请不胜感激。

标签: haskellsemanticsstrictness

解决方案


据我所知,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. 但在我看来,这种转变更多的是关于记忆而不是懒惰:在我看来,上述两个术语在懒惰/严格方面具有相同的(指称)语义,只是在操作上有所不同。


推荐阅读