Рассмотрим функцию words
Prelude; это очень просто, и его можно записать следующим образом:
words' :: String -> [String]
words' [] = []
words' str = before : words' (dropWhile isSpace after) where
(before, after) = break isSpace str
Однако, я заметил, что его оригинальный код Prelude выглядит намного меньше... natural:
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 не выполнил некоторые из самых простых оптимизаций на низком уровне:
Сравнительное сравнение гипотез с гипотезой Haskell Collatz
но в стороне для бит {-partain:Char.-}
(этот подсказку для компилятора не очень помогает в этой ситуации IMO) код words
кажется ненужным раздутым для языка высокого уровня. В чем причина этого в этом случае?