【发布时间】:2009-12-29 18:53:48
【问题描述】:
我有一个函数,它接收数据并返回相同的数据或稍作修改的版本。
我想让我的程序在它改变时做一件事,如果它没有改变,我想让它做另一件事。
以前我返回一对(Bool,Object) 并使用fst 检查它是否改变了。最近我突然想到,我可以通过返回对象并使用==检查是否相等来简化代码。
但后来我意识到 Haskell 并没有区分深度相等检查和“对象标识”(即指针相等)。那么我怎么知道使用== 是否有效呢?我应该出于效率原因避免它,还是在某些情况下我可以依赖编译器来确定它不需要进行深度相等检查?
通常我在编写初始程序时不会太担心效率,但这会影响到我的模块的接口,所以我想在编写太多代码之前把它做好,而且似乎不值得做该程序的效率要低得多,只需一小段代码。此外,我想更好地了解我可以依靠 GHC 来帮助我进行哪些优化。
【问题讨论】:
-
请注意,对于
Either值或等效但更语义化的值(例如data ChangeState a = Same a | Changed a),这似乎是一个更好的情况。
标签: performance haskell