2011-10-05 85 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,类绝对是更好的选择。