Глава 12. Расширения языка
25 Типозависимое разрешение неоднозначности литералов массивов
(Добавлено в OCaml 5.4)
Начиная с OCaml 5.4 синтаксис литералов массивов [| e1 ; e2 ; ... ; eN |] можно использовать для обозначения значений типа floatarray или 'a Iarray.t, а также 'a array — как в позициях выражений, так и в позициях шаблонов. Этот синтаксис также используется для отображения значений floatarray и 'a Iarray.t в интерактивном верхнеуровневом цикле.
Компилятор сопоставляет ожидаемый тип выражения или шаблона с типом литерала аналогично разрешению неоднозначности конструкторов и полей записей (см. 1.4.1).
Если ожидаемый тип отсутствует, считается, что литералы массивов имеют тип 'a array.
В следующих примерах литералам массивов присваивается тип floatarray:
let _ : floatarray = [|42.|];; - : floatarray = [|42.|]
let _ = ([|42.|] : floatarray);; - : floatarray = [|42.|]
let _ = Float.Array.length [|42.|];; - : int = 1
Неизменяемые массивы (здесь int Iarray.t) можно создавать точно так же:
let _ : _ Iarray.t = [|42|];; - : int Iarray.t = [|42|]
let _ = ([|42|] : _ Iarray.t );; - : int Iarray.t = [|42|]
let _ = Iarray.length [|42|];; - : int = 1
Тот же механизм разрешения неоднозначности используется для литералов массивов в шаблонах:
let f : floatarray -> _ = function | [| 42. |] -> "It's a floatarray containing one element" | _ -> "Also a floatarray" ;; val f : floatarray -> string =
В приведённом ниже примере переменной x присваивается тип float array:
let x = [|42.|];; val x : float array = [|42.|]
Однако следующий вариант не работает:
let f a =
match a with
| [| _ |] -> Float.Array.length a
| _ -> 42
;;
Error: The value a has type 'a array but an expression was expected of type
Float.Array.t = floatarray let f b (a : floatarray) = if b then [|42.|] else a
;;
Error: The value a has type floatarray but an expression was expected of type
float array Здесь информация, полученная при использовании a в качестве floatarray, не может быть передана обратно литералу массива. В общем случае информацию об ожидаемом типе нельзя передавать «в обратном направлении».
В следующем примере разрешение неоднозначности типов работает, потому что информация о типе, полученная в ветви then условного выражения, передаётся в ветвь else, которая расположена «позже».
let f b (a : floatarray) = if b then a else [|42.|];; val f : bool -> floatarray -> floatarray =
В таких случаях возникает предупреждение 18 not-principal, если оно включено.
© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/arrayliterals.html