Why isn't the Prelude's words function written more simply?
考虑words前奏函数,它非常简单,可以用以下方式编写:
然而,我注意到它最初的序曲代码似乎要少得多…自然:
号
我假设有与优化相关的原因。问题是:我是否错误地认为编译器应该优化words'函数和它的前奏版本?我确实使用了相同的函数(break、dropWhile、isSpace。
我曾经非常惊讶地发现,GHC没有执行一些最简单的低级优化:
C与Haskell-Colatz推测速度比较
但是除了{-partain:Char.-}位(这对编译器的提示在这种情况下似乎不太有用),对于高级语言来说,words代码似乎不必要地膨胀了。在这种情况下,背后的原因是什么?
- 顺便说一下,我认为{-partain:Char.-}位不只是一个注释掉的模块名。据谷歌称,一位姓帕坦的人不久前在GHC工作。我猜是他在发表评论。
- 哦,我想它可能对编译器有一些影响。和派对上的人相处得很好!
- 那将是聚会。
这几乎是相同的代码。唯一的区别是,如果我们在每次调用之前执行dropWhile isSpace,或者只执行递归调用。两者都不比另一个复杂,但后者(前奏曲)版本似乎更冗长,因为模式匹配不直接在函数中。
您可以这样观察差异(以及为什么前奏曲版本有更好的表现):
请注意,您可以快速验证您的"改进"版本是否与使用QuickCheck的原始版本相同。
- 嗯,我认为我的版本在任何方面都不比原版好,但这就是重点;对我来说,唯一的区别似乎是冗长。
- 我在Prelude和其他一些核心库中又看了一眼,我必须说,函数定义中的冗长事实上是非常罕见的(并且可能由类似您描述的情况来解释)。原来的题目是夸张的:)。