2012-07-12 65 views
2

有沒有辦法處理F#中的多態性與記錄類型有關?F#多態性

只是舉一個例子,假設我們有兩種記錄類型的地址,街道地址和地址。 我認爲,當涉及到行爲時,我們可以在模式匹配中處理它們。 但有關引用什麼,有沒有辦法從其他記錄

回答

8

如果我理解正確的話你的問題,我會使用一個可識別聯合:

type StreetAddress = {. . . } 
type BoxAddress = {. . .} 

type Address = 
    | StreetAddress of StreetAddress 
    | BoxAddress of BoxAddress 

,然後你可以創建並引用Address值。

如果街道和郵箱地址共享,你可以把它變成一個獨立的BaseAddress記錄類型的一些常見的數據,那就是再由Address內部使用StreetAddressBoxAddress,或者直接使用:

type BaseAddress = {. . . } 
type StreetAddress = {. . . } 
type BoxAddress = {. . .} 

type Address = 
    | StreetAddress of BaseAddress*StreetAddress 
    | BoxAddress of BaseAddress*BoxAddress 
-2

所以我認爲你希望能夠像

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} 

實際上可以創建並可能是你想要

+1

你必須思考的SML - 確實值得遞歸是被禁止的。在F#(和OCaml)中編譯得很好:http://gist.github.com/3098571 – t0yv0 2012-07-12 14:45:28