2011-10-05 90 views
2
構建一個F#記錄

是否有可能採取類似的記載:通過位置參數

type Foo = { 
    Bar: int 
    Baz: double 
} 

,構建它像一個函數調用? (也許let foo = Foo 3 4.5,但似乎並沒有工作。)

現在得到這個功能我做

let createFoo bar baz = { Bar = bar; Baz = baz } 

但我想確保我不缺少的東西。

謝謝,對不起,如果這已經問過!

回答

4

沒有提到的是,你可以添加一個方法來記錄類型像

type Foo = { 
    Bar: int 
    Baz: double 
} 
with 
    static member create bar baz = 
     {Bar=bar; Baz=baz} 

,然後用它像

let foo = Foo.create 3 4.5 

(所以你必須對語法的工作,但它保持良好的組織類型的一部分)。

0

我不認爲這是可能的 - 我的猜測,爲什麼會是,如果你有

type Foo = { 
    Bar: int 
    Baz: int 
} 

那麼編譯器如何知道哪個元素去的地方會發生什麼。

1

注意,有一個叫「類」與被稱爲「構造」,似乎像它可能適合您的方案事情一件很棒的事情。 :)

或者,你總是可以定義

let mkFoo x y = { Bar=x; Baz=y } 
+1

替代方案存在於問題中 – manojlds

2

前面已經提到的功能,記錄只能使用記錄施工語法創建的。另一種使用記錄(除了Brian提到的類別)的替代方法是使用具有單個案例的區分聯盟。

這樣,類型聲明和價值建設僅僅是一個單行:

type Foo = Foo of int * float 

// Create value of 'Foo' 
let value = Foo(42, 4.2) 

// Decompose value into int and float in a function call 
let add (Foo(n, f)) = 
    (float n) + f 

聲明類型的這種方式是非常簡單的,所以它交互編寫代碼時工作良好。對於從C#使用的公共API,類絕對是更好的選擇。