2015-11-29 3 views
0

Я хочу сгенерировать последовательность от 10 до 1 по убыванию.enumFromTo, который идет в обратном направлении

Самый простой способ с использованием стандартных библиотечных функций

reverse [1..10] 

Однако это реализуется неэффективно - это генерации списка, а затем обратить вспять ее. Однако

[10..1] 

генерирует пустой список.

Я знаю, что [1..10] просто синтаксический сахар для

enumFromTo 1 10 

Есть ли стандартная библиотека «перечисление *» функция, которая перечисляется из более высокого элемента вниз к нижней?

+1

Насколько мне известно, нет лучшего способа сделать это, чем ' 10, 9..1' трюк, указанный ниже. Это бородавка языкового дизайна. См. Http://stackoverflow.com/questions/6806455/decrementing-ranges-in-haskell, который пришел к тому же ответу. – hao

ответ

3

Лучший способом я нашел до сих пор:

[10,9..1] 

, который вызывает функцию enumFromThenTo:

enumFromThenTo 10 9 1 
-> [10,9,8,7,6,5,4,3,2,1] 
[10,9..1] 
-> [10,9,8,7,6,5,4,3,2,1] 

Но есть обертка в стандартной прелюдии, которая будет делать это?

1

Вы также можете написать свою собственную функцию:

reverseEnum :: Int -> Int -> [Int] 
reverseEnum a b 
    | a == b = [a] 
    | a >= b = a : reverseEnum (a-1) b 
    | a <= b = [] 

Вот пример использования:

reverseEnum 10 1 
-> [10,9,8,7,6,5,4,3,2,1] 
Смежные вопросы