【发布时间】:2016-09-08 00:57:49
【问题描述】:
是否可以在 Haskell 中关闭惰性求值?
库是否有特定的编译器标志来促进这一点?
我想用我不久前编写的旧程序尝试一些新的东西,看看我是否可以提高性能。
【问题讨论】:
-
它是语言伙伴的一部分,处于最深层次。你有什么特别想渴望的吗?
-
是否可以关闭 C 语言中的严格评估?我希望不会,至少在没有对语言语义进行深入的重新设计的情况下不会。当然,可以对 C 中的特定表达式实现某种惰性求值。所有这些语句对于 Haskell 也是如此,除了“严格”和“惰性”互换。
-
@Yitz - 现实世界的计算机使用严格的评估。编译器不需要努力工作来严格评估 - 他们需要努力工作(添加 thunk、延迟评估、严格分析以确定哪些地方没有必要)来支持惰性。 GHCs 作者花了很长时间来控制这些开销,尽管如此,严格的语言比同一语言的惰性版本更具有引用透明性 - 惰性意味着时间和空间复杂性由于延迟计算和引用不透明用于跟踪它们的可变数据结构。
-
@Yitz - 普遍的惰性求值在交互式和实时程序中尤其成问题。懒惰不是在有足够时间的时候做工作,而是将工作推迟到需要结果的时候——根据定义,当已经太晚了。当然,Haskell 中有一些具有选择性严格性的解决方法,但这并不是微不足道的——例如
$!仅将 strict 参数强制为 head-normal 形式 - 将其用于列表,其成员仍会被延迟评估。 -
@Steve314 - 不,真正的计算机使用编译器将它们编译成的任何语义。在硬件层面,现代处理器的语义与 C 的命令式模型的差距几乎与它们与 Haskell 的非严格模型的差距一样大。在任何成熟的语言中,有经验的程序员都可以优化到与硬件平台匹配所需的任何级别,同时仍然尽可能地受益于语言的优势,Haskell 也不例外。在 Haskell 中并不比在 C 中更难。
标签: haskell