> 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]
терпит неудачу? Почему бы просто не вернуть пустой массив? Есть причины такого поведения?