Рассмотрим функцию 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 кажется ненужным раздутым для языка высокого уровня. В чем причина этого в этом случае?