2012-05-07 52 views
4

記錄和元組之間有什麼區別,這不僅僅是語法上的區別嗎?OCaml中的記錄和元組有什麼區別

是否有性能差異?

元組和記錄的實現是否相同?

你有沒有使用元組可以完成的事情的例子,但沒有記錄(和 相反)?

+0

是什麼導致了這種問題?他們適合不同的應用程序。在這個階段我不會擔心表演。實現不是「相同的」,因爲...他們是不同的東西。 – Ashe

+0

如果他們是不同的東西,那麼你有沒有使用元組可以完成的事情的例子,但是沒有記錄(反過來)?我問這個問題是因爲你說的兩件事情看起來和我很相似。 – Thomash

+0

定義「可以完成」。原諒惠顧的聲調,但任何事情都可以用圖靈機完成。記錄只是提供了更容易的訪問,也就是說,您不需要爲了獲得一個元素而解構整個事物。它們更好的文檔記錄,以及更容易的訪問,允許使用'mutable'關鍵字和'<-'語法更容易地更新refs。 – Ashe

回答

8

float-only記錄或數組中的浮點字段被解除存儲,而沒有這種優化適用於元組。如果您要存儲大量浮點數並僅存儲浮點數,那麼使用記錄非常重要 - 您可以通過拆分混合浮點數/其他數據結構以獲得內部僅浮點數記錄來獲得。

其他的差異是在類型級別,並已由安德烈亞斯描述 - 記錄是生成的,而元組預先存在並具有結構語義。如果你想要多態訪問器的結構記錄,你可以使用對象類型。

12

Modulo語法它們幾乎是相同的。主要的語義差異是元組是結構類型,而記錄是名義類型。這意味着該記錄可以是遞歸的,而元組無法(至少不無-rectypes選項):

type t = {a : int, b : unit -> t} (* fine *) 
type u = int * (unit -> u)   (* error *) 

此外,記錄可以具有可變領域,元組不能。

FWIW,在OCaml的姐妹語言SML中,元組記錄。也就是說,在SML中(a,b,c)只是{1 = a,2 = b,3 = c}的語法糖,記錄也是結構類型。

+0

Re:可變字段,沒有什麼能夠阻止你定義'type v = int * int ref'然後說snd some_v:= 90210'。 – Ashe

+0

感謝您的回答。你知道關於性能差異的一些東西嗎? – Thomash

+0

@恩:是的,但實際上是一個嵌套到OCaml中的元組的記錄,其中'a ref = {mutable content:'a}。也就是說,你有一個額外的間接。最終,可變性總是與記錄相關聯。 –

相關問題