我翻譯下面的Haskell代碼OCaml的:記錄類型沒有類型構造函數?
data NFA q s = NFA
{ intialState :: q
, isAccepting :: q -> Bool
, transition :: q -> s -> [q]
}
起初我嘗試了很直譯:
type ('q,'s) nfa = NFA of { initialState: 'q;
isAccepting: 'q -> bool;
transition: 'q -> 's -> 'q list }
...當然這給出了一個語法錯誤,因爲類型構造的一部分,「NFA of」是不允許的。它必須是:
type ('q,'s) nfa = { initialState: 'q;
isAccepting: 'q -> bool;
transition: 'q -> 's -> 'q list }
這讓我想知道爲什麼這樣。爲什麼你不能像記錄類型一樣爲記錄類型設置類型構造函數(如下所示)?
type ('q, 's) dfa = NFA of ('q * ('q->bool) * ('q -> 's -> 'q list))
「你爲什麼想要一個類型構造函數的記錄類型」 - 你說得對,它們通常沒有用,除了可能有一種情況:包含記錄的和類型:type somerecs = REC1 {a:.. ; b:..} | REC2的{c:..; d ..}等等。但正如你所說,這很容易解決。 「 – aneccodeal 2011-12-29 00:06:12
」在你演示的例子中沒有元組,只有一個帶有多個參數的總和類型,bar * baz的Foo與(bar * baz)的Foo不一樣。「謝謝,那是一個提示! – aneccodeal 2011-12-29 00:09:50
很少的事情:1.當你說記錄是一個「原始概念」和「有自己的身份」時,我認爲你的意思是記錄是OCaml中的一個特例,與SML中的記錄不同,它們是一流的。 2.從程序員的角度來看,誰是內存佈局細節的(不言而喻)不可知的,這裏*是*記錄和元組之間的不對稱性w.r.t構造函數參數。你的例子演示了它。 3.記錄作爲參數的構造函數與具有命名參數的構造函數不同。 – 2015-07-17 07:59:59