lje*_*drz 14 compiler-construction optimization haskell
考虑wordsPrelude功能; 它非常简单,可以用以下方式编写它:
words' :: String -> [String]
words' [] = []
words' str = before : words' (dropWhile isSpace after) where
    (before, after) = break isSpace str
但是,我注意到它的原始Prelude代码似乎更少......自然:
words                   :: String -> [String]
words s                 =  case dropWhile {-partain:Char.-}isSpace s of
                                "" -> []
                                s' -> w : words s''
                                      where (w, s'') =
                                             break {-partain:Char.-}isSpace s'
我假设有与优化相关的原因.问题是:我错误地认为编译器应该words'像Prelude版本一样优化函数吗?我没有使用相同的功能(break,dropWhile,isSpace).
我曾经非常惊讶GHC没有执行一些最简单的低级优化:
但除了这些{-partain:Char.-}位(这种情况下编译器的提示在IMO这种情况下似乎没有用),words代码似乎对于高级语言来说是不必要的.在这种情况下,它背后的原因是什么?
scl*_*clv 12
这几乎是完全相同的代码.唯一的区别是,如果我们dropWhile isSpace在每次通话之前做或只做递归通话.两者都不比另一个复杂,但后者(Prelude)版本似乎更冗长,因为模式匹配不直接在函数中.
您可以观察差异(以及Prelude版本具有更好行为的原因),如下所示:
*Main> words "    "
[]
*Main> words' "     "
[""]
请注意,您可以快速验证"改进"版本是否与使用的原件相同QuickCheck.
| 归档时间: | 
 | 
| 查看次数: | 783 次 | 
| 最近记录: |