2017-02-03 37 views
0

OCamlに配列があれば、その型を最初に取得して配列要素のサイズを取得します。OCamlで配列の要素型を取得する方法

# let element_type = Array.element_type arr;; 
# let element_size = of_int (sizeof element_type);; 

ただし、Array.element関数は使用できないようです。他に何ができますか?

答えて

2

OCamlは静的に型指定されています。実行時に型やサイズについて話す方法は(一般的に)ありません。

一方、モジュールが型のための独自のエンコーディングを作成することを妨げるものはありません。例えば、Bigarrayモジュールはこれを行います。おそらくそれはあなたが考えているものです。

# let a = Bigarray.Array1.create Bigarray.int16_unsigned 
      Bigarray.c_layout 100;; 
val a : 
    (int, Bigarray.int16_unsigned_elt, Bigarray.c_layout) 
    Bigarray.Array1.t = <abstr> 
# Bigarray.kind_size_in_bytes (Bigarray.Array1.kind a);; 
- : int = 2 
+0

機能は、次のようになります。ランタイムではありません。私は、この関数がより一般的なケースを扱うことができれば幸いです。 –

+0

実行時間ではない関数が何を意味しているのかを理解できない。ここで指定した型の関数は ''a'型の* value *を返します。型自体は返されません。この型の関数の例は 'let f a = a。(0)'です。 –

4

タイプは値ではなく、メモリ内の表現はありません。型はソースコード内にのみ存在し、特定のランタイムエラーが存在しないことを静的に検証するために型チェッカーによって使用されます。タイプはコンパイル中にプログラムから消去されます。 JavaやC++のような他の言語のように、型の実行時表現はありません。

すべての値は、即時整数またはヒープへのポインタとしてOCamlで一様に表されます。したがって、すべての値は同じサイズ、つまり機械語のサイズと同じです。さらに、厳密に言えば、値の表現は実装固有のものであり、直接アクセスするべきではありません。 OCamlはCではなく、メモリ表現を扱います(抽象化します)。だから内部を掘り下げることは悪い考えです。

コメントの明確化の後、Ctypesライブラリの配列型について話していたことが明らかになりました。 Ctypesライブラリは(両方向の)C言語へのインターフェイスを提供し、OCaml値としてCの型を表します。また、C配列をOCaml値として表す型のCArray.tも提供します。ヴァルタイプ:: - 「>配列」は配列の場合、あなたは間違いなくCtypes.CArray.element_type機能を利用することによって、サイズを取得することができ、例えば、私が求めてい

let sizeof_element arr = sizeof (CArray.element_type arr) 
+0

ありがとう!私はこのhttps://realworldocaml.org/v1/en/html/foreign-function-interface.htmlを読んでいて、例Aを試しています。この例では、Array.element_typeを使用しています。私はこの機能が時代遅れかもしれないと考えましたが、いくつかの選択肢が必要です。 –

+0

この例では、OCamlはCでqsort関数を使用しています(OCamlは独自のソートを持っています)、配列をソートします。 Cのqsortには要素のサイズが必要ですが、これは私が解決しようとしている問題です。 –

+0

ああ、今それは完璧な意味で、あなたの質問は 'Ctypes'ライブラリと' Ctypes.CArray'です。この本の例では、恐らく混乱していた古い名前の 'Array'を使用しています。 'Array'のすべての出現を' CArray'で置き換えます。 – ivg

関連する問題