Почему функция слов "Прелюдия" написана более просто? - программирование
Подтвердить что ты не робот

Почему функция слов "Прелюдия" написана более просто?

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

4b9b3361

Ответ 1

Это почти точно такой же код. Единственное различие заключается в том, что мы делаем dropWhile isSpace перед каждым вызовом или только с рекурсивным вызовом. Ни один из них не является более сложным, чем предыдущий, но, скорее, последняя версия (Prelude) представляется более подробной, поскольку сопоставление шаблонов не является непосредственно функцией.

Вы можете заметить разницу (и почему версия Prelude имеет лучшее поведение):

*Main> words "    "
[]
*Main> words' "     "
[""]

Обратите внимание, что вы можете быстро проверить, соответствуют ли ваши "улучшенные" версии оригиналами с помощью QuickCheck.