関数と同じ制限。
はより正確には、インデックス演算子は現在、非常に浅いシンタックスシュガーです:パーサはx.(n)
Array.set x n y
からArray.get x n
にとx.(n) <- y
書き換えて(またはArray.unsafe_get
とArray.unsafe_set
を-unsafe
オプションでコンパイルされている場合)。同様に、 s.[n]
はString.get s n
に書き換えられ、s.[n]<-x
はString.set s n x
になります。
これは、新しいArray
モジュールを定義することによって、独自のインデックス演算子を定義することが可能であることを意味します。ハックこの種のコードは、将来的に動作するという保証がないこと
module Array = struct
include Array
let get a n = get a (n-1)
let unsafe_get a n
end
;; [|1|].(1)
注:たとえば、以下の無分別 トリックは、配列のインデックスは1
から開始いたします。独自のインデクシング演算子を定義したい場合は、ドット.
と左括弧((
,[
,{
のいずれか)の間に少なくとも1つの(演算子)文字を挿入して拡張インデックス演算子を定義することが可能です。
let (.?()) dict key = Dict.find_opt dict key
あなたは、どういうわけか、少ないインデックス演算子をご希望の場合は、配列のようなデータ型のプリミティブ操作ではなく、関数呼び出しをインデックスを作成する命題があります。これにより、すでにレコードフィールドに対して行われているように、型指向の曖昧さ回避を使用することができます。これは、タイプチェッカーがタイプ情報を使用してどのプリミティブ操作を使用すべきかを解決するので、両方とも
let first (s:string) = s.(0)
let first (a: _ array) = a.(0)
となる可能性があることを意味します。
しかし、この提案はまだ進行中です(https://github.com/ocaml/ocaml/pull/616参照)。そのため、文字列とジェネリック配列のインデックスを構文で区別する必要があります。