Почему [1..n] не обрабатывается так же, как [n..1] в Haskell? - PullRequest
5 голосов
/ 08 сентября 2011

Я пытался решить проблему, которая требовала максимального значения списка после сопоставления с помощью функции. Список представляет собой диапазон от a до b, где a> b или b> a. Поскольку Haskell также может определять убывающие списки, я подумал, что мне не нужно проверять, если a> b, и нет необходимости переставлять границы на b..a. Функция выглядит примерно так:

f a b = maximum . map aFunction $ [a..b]

Но если список уменьшается, т.е. a> b, тогда Haskell дает мне исключение:

Prelude.maximum: empty list

Так что по какой-то причине уменьшающийся список передает пустой список функции максимального значения. Почему это так?

Я знаю, что maximum определяется в терминах foldl1 max и что foldl1 нужен непустой список, но я не знаю, почему такой список, как [10..1], пуст при передаче foldl1 .

Ответы [ 3 ]

15 голосов
/ 08 сентября 2011

[a..b] десугаров до enumFromTo a b. Для стандартных числовых типов (по модулю пара причуд для плавающих) это продолжает добавлять один, пока вы не наберете >= b. Так где b < a это пусто.

Вы можете изменить приращение, используя следующий синтаксис [a,a'..b], который затем выполняет шаги с шагом a'-a. Так что [10,9..1] будет тем, что вы хотите.

5 голосов
/ 08 сентября 2011

Это из-за способа, которым последовательность определена в Арифметические последовательности отчета Haskell

[e1..e3] = enumFromTo e1 e3

и Haskell Report The Enum Class

Последовательность enumFromTo e1 e3 является списком [e1, e1 + 1, e1 + 2, ... e3]. Список пуст, если e1> e3.

(выделение добавлено).

3 голосов
/ 08 сентября 2011

Они обрабатываются точно так же.Вы начинаете с первой границы и начинаете считать.

...