有沒有辦法處理F#中的多態性與記錄類型有關?F#多態性
只是舉一個例子,假設我們有兩種記錄類型的地址,街道地址和地址。 我認爲,當涉及到行爲時,我們可以在模式匹配中處理它們。 但有關引用什麼,有沒有辦法從其他記錄
有沒有辦法處理F#中的多態性與記錄類型有關?F#多態性
只是舉一個例子,假設我們有兩種記錄類型的地址,街道地址和地址。 我認爲,當涉及到行爲時,我們可以在模式匹配中處理它們。 但有關引用什麼,有沒有辦法從其他記錄
如果我理解正確的話你的問題,我會使用一個可識別聯合:
type StreetAddress = {. . . }
type BoxAddress = {. . .}
type Address =
| StreetAddress of StreetAddress
| BoxAddress of BoxAddress
,然後你可以創建並引用Address
值。
如果街道和郵箱地址共享,你可以把它變成一個獨立的BaseAddress
記錄類型的一些常見的數據,那就是再由Address
內部使用StreetAddress
和BoxAddress
,或者直接使用:
type BaseAddress = {. . . }
type StreetAddress = {. . . }
type BoxAddress = {. . .}
type Address =
| StreetAddress of BaseAddress*StreetAddress
| BoxAddress of BaseAddress*BoxAddress
所以我認爲你希望能夠像
type A = {aval:int;b:B}
and B = {bval:int;a:A}
現在這個定義會創造一些引用(沒有意思對象REF)兩種類型編譯得很好,但是你不能實際創建它,因爲記錄是不變的,你不能創建所需的遞歸結構。然而,像事端
type A = {aval:int;b:B option}
and B = {bval:int;a:A option}
實際上可以創建並可能是你想要
你必須思考的SML - 確實值得遞歸是被禁止的。在F#(和OCaml)中編譯得很好:http://gist.github.com/3098571 – t0yv0 2012-07-12 14:45:28