Ответ 1
В принципе, поскольку [10..1]
переводится на enumFromTo 10 1
, который сам имеет семантику для создания списка, беря все элементы меньше, чем 1
, которые являются результатом подсчета вверх (с размером шага +1
) из ( в том числе) 10
.
В то время как [10, 9..1]
переводится на enumFromToThen 10 9 1
, который явно устанавливает размер шага подсчета как 9-10
, т.е. -1
(который жестко закодирован до +1
для enumFromTo
)
Более точная спецификация может быть найдена в отчете Haskell (6.3.4 Класс Enum):
enumFrom :: a -> [a] -- [n..]
enumFromThen :: a -> a -> [a] -- [n,n'..]
enumFromTo :: a -> a -> [a] -- [n..m]
enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
Для типов
Int
иInteger
функции перечисления имеют следующий смысл:
Последовательность
enumFrom e1
- это список[e1,e1+1,e1+2,...]
.Последовательность
enumFromThen e1 e2
представляет собой список[e1,e1+i,e1+2i,...]
, где приращение я является e2-e1. Инкремент может быть нулем или отрицательным. Если приращение равно нулю, все элементы списка одинаковы.Последовательность
enumFromTo e1 e3
- это список[e1,e1+1,e1+2,...e3]
. Список пуст, еслиe1 > e3
.Последовательность
enumFromThenTo e1 e2 e3
- это список[e1,e1+i,e1+2i,...e3]
, где приращениеi
равноe2-e1
. Если приращение положительное или ноль, список заканчивается, когда следующий элемент будет больше, чемe3
; список пуст, еслиe1 > e3
. Если приращение отрицательное, список заканчивается, когда следующий элемент будет меньшеe3
; список пуст, еслиe1 < e3
.