在Haskell中自动插入懒惰

Jun*_* Xu 7 haskell strictness semantics

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

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

我的问题是:GHC是否已通过某种严格性分析实施此类转换?如果您还可以指出我的一些阅读材料,请欣赏它.

Dan*_*ner 5

据我所知,GHC永远不会比程序员指定的更懒惰,即使它可以证明不会改变术语的语义.当我们能证明语义没有改变时,我认为没有任何根本原因可以避免改变术语的懒惰; 我怀疑这更像是一种经验观察,我们不知道任何情况下这将是一个非常好的主意.(如果转换改变语义,我会认为这是GHC做出改变的一个错误.)

只有一个可能的例外,即所谓的"完全懒惰"转换,在维基上很好地描述.简而言之,GHC将翻译

\a b -> let c = {- something that doesn't mention b -} in d
Run Code Online (Sandbox Code Playgroud)

\a -> let c = {- same thing as before -} in \b -> d
Run Code Online (Sandbox Code Playgroud)

c每次将参数应用于new时都要避免重新计算b.但在我看来,这种转变更多的是关于记忆而不是关于懒惰:上面的两个术语在我看来具有相同(指称)语义和懒惰/严格,并且仅在操作上不同.

  • 值得注意的是,原始问题*中建议的改变确实*改变语义和懒惰 - 它删除了一些可能的底部.有时候你需要非常精确地控制代码可以产生什么底部,而编译器切换到你身上是很尴尬的. (3认同)