2017-02-03 33 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

我在尋找看起來應該是這樣的功能:VAL類型:「一個數組 - >」一個。這不是運行時間。我只希望這個函數可以處理更一般的情況。 –

+0

我很難理解你的意思是不是運行時間的函數。你在這裏給出的類型的函數將返回類型爲'a'的*值*。它不返回類型本身。這種類型的函數的一個例子是'let f a = a。(0)'。 –

4

一個類型不是一個值,它沒有任何內存中的表示。類型僅存在於源代碼中,並由類型檢查器用於靜態驗證是否缺少某些運行時錯誤。在編譯過程中,類型會從程序中刪除。沒有類型的運行時表示,就像Java和C++等其他語言一樣。

所有的值在OCaml中統一表示,或者是一個立即數或者是一個指向堆的指針。因此,所有值都具有相同的大小,即等於機器字的大小。此外,嚴格來說,價值表示是特定於實現的,您不應該直接訪問它。 OCaml不是C,它負責處理內存表示(並將其抽象出來)。所以試圖深入其內部是一個壞主意。

在評論中澄清之後,顯然您正在討論Ctypes庫中的數組類型。 Ctypes庫提供了C語言的接口(雙向),並將C類型表示爲OCaml值。他們還提供了一個代表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',這個名字令人困惑(正如你所看到的)。用'CArray'替代所有出現的'Array'。 – ivg

相關問題