Я читаю учебник learn you a haskell и Я пробовал некоторые примеры, приведенные автором .Haskell Pattern Matching: удобочитаемость и производительность
Например, он переопределен почтовый индекс следующим образом:
zip' :: [a] -> [b] -> [(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys
Он использует подобный подход для всех его других примеров, , где он ставит самые конкретные образцы первой. Вот немного отличается версии функции почтового индекса:
zip' :: [a] -> [b] -> [(a,b)]
zip' (x:xs) (y:ys) = (x, y):zip' xs ys
zip' _ _ = []
Насколько я понимаю, оба метода делает то же самое. Если предоставляется пустой список в любом направлении (x: xs) или (y: ys), не будет соответствовать, который завершит рекурсию, добавив пустым списком [].
- Я лично предпочитаю вторую версию для удобочитаемости, но, возможно, я ошибаюсь в этом.
- Оказывает ли это какое-либо влияние на эффективность метода? Насколько я понимаю, если самый верхний шаблон не соответствует, Haskell будет проверять следующий шаблон. Оказывает ли порядок паттернов влиянию на производительность?
С наилучшими пожеланиями,
Edit:
Возможно дубликата: Haskell GHC: what is the time complexity of a pattern match with N constructors?
Резюме: Порядок моделей очень важно для семантики (с точки зрения строгой оценки аргументов) и читаемость функции. Совпадение шаблона всегда будет в O (1) сложность времени.
Возможный дубликат [Haskell GHC: какова временная сложность совпадения шаблонов с конструкторами N?] (Http://stackoverflow.com/questions/9027384/haskell-ghc-what-is-the-time-complexity -of-a-pattern-match-with-n-constructors) – Nimi