在Haskell中自动插入懒惰

问题描述 投票:7回答:1

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

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

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

haskell semantics strictness
1个回答
5
投票

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

只有一个可能的例外浮现在脑海中,即所谓的“完全懒惰”转换,很好地描述了on the 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。但在我看来,这种转变更多的是关于记忆而不是关于懒惰:上面的两个术语在我看来具有相同(指称)语义和懒惰/严格,并且仅在操作上不同。

© www.soinside.com 2019 - 2024. All rights reserved.