странное поведение при разрезании массива

> let a = [| 'a'..'d' |];;
val a : char [] = [|'a'; 'b'; 'c'; 'd'|]

Выполните тривиальную нарезку:

> a.[1..2], [1..2];;
val it : char [] * int list = ([|'b'; 'c'|], [1; 2])

Теперь попробуйте с пустой областью:

> a.[1..0], [1..0];;
val it : char [] * int list = ([||], [])

Кажется, работает и разумно -мы получили две пустые последовательности.

Но здесь это не работает:

> a.[5..0];;
System.OverflowException: Arithmetic operation resulted in an overflow.
   at <StartupCode$FSI_0018>.$FSI_0018.main@()
Stopped due to error

Конечно, есть обходной путь [| for i in [5..0] -> a.[i] |]. Но я упускаю из виду, почему a.[5..0]терпит неудачу? Почему бы просто не вернуть пустой массив? Есть причины такого поведения?

6
задан qehgt 22 April 2012 в 15:37
поделиться