Синтаксис [e1, e2 .. e3]
- действительно синтаксический сахар для enumFromThenTo e1 e2 e3
, который является функцией в Enum
typeclass.
Стандарт Haskell определяет его семантику следующим образом :
Для типов
Int
иInteger
функции перечисления имеют следующее значение:blockquote>
- Последовательность
enumFrom e1
- это список[e1,e1 + 1,e1 + 2,…]
].- Последовательность
enumFromThen e1 e2
- это список[e1,e1 + i,e1 + 2i,…]
, где приращениеi
равно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
.Это в значительной степени то, что вы ожидаете, но экземпляры
Float
иDouble
определяются по-разному:Для
blockquote>Float
иDouble
семантика семействаenumFrom
задана правилами дляInt
выше, за исключением того, что список заканчивается, когда элементы становятся большеe3 + i∕2
для положительного приращенияi
или когда они становятся меньшеe3 + i∕2
для отрицательныхi
.Я не совсем уверен, что оправдание для этого, поэтому единственный ответ Я могу дать вам то, что это так, потому что он определен таким образом в стандарте.
Вы можете обойти это, перечислив использование целых чисел и преобразовывая его в
Float
.Prelude> map fromIntegral [1, 3 .. 10] :: [Float] [1.0,3.0,5.0,7.0,9.0]