Haskell中的平等效率

Ste*_*eve 18 performance haskell

我有一个获取数据的函数,并返回相同的数据或稍微修改过的版本.

我希望让我的程序做一件事,如果它改变了或另一件事,如果它没有改变.

以前我回来了一对(Bool,Object)并用fst它来检查它是否改变了.最近,我想到我可以通过返回对象并使用检查相等来简化代码==.

但后来我意识到Haskell没有区分深度相等检查和"对象身份"(即指针相等).那么我怎么知道使用是否==有效?我是否应该出于效率原因而避免使用它,或者是否存在依赖于编译器确定它不需要进行深度相等检查的情况?

通常我在编写初始程序时不会太担心效率,但这会影响我的模块的接口,所以我想在编写太多代码之前做到正确,并且似乎不值得让程序更多仅仅是一小段代码效率较低.此外,我想更好地了解我可以依靠GHC进行哪种优化来帮助我.

Nor*_*sey 34

依靠不确定的编译器优化来提供诸如恒定时间相等与线性时间深度相等之类的重要性能保证始终是一个坏主意.使用封装值的新类型以及有关值是否为新的信息,您会好得多.根据您的应用,这可以是

data Changed a = Changed a | Unchanged a
Run Code Online (Sandbox Code Playgroud)

要么

data Changed a = Changed a | Unchanged
Run Code Online (Sandbox Code Playgroud)

我们实际上在Glasgow Haskell编译器中使用了类似的类型,因此我们可以继续运行优化器,直到代码停止更改.我们还运行迭代数据流分析,直到结果停止变化.

我们发现将这种类型作为monad是有用的,这样我们就可以使用do符号来编写一些简单的高阶函数,但这不是必需的 - 只是方便.

简介:如果您需要进行常量时间检查,请自行编写代码 - 不要依赖可能不存在的编译器优化 - 或者在下一个版本中可能会更改.

  • 我想知道这是如何作为一个单子?第二个版本看起来像'Maybe` monad.然而,与"可能"不同,这里你想要的是最后一个未改变的结果,而不仅仅是知道它后来是"未改变". (3认同)