通过位置参数构造F#记录

时间:2011-10-05 23:18:58

标签: syntax f#

是否可以采取如下记录:

type Foo = {
  Bar: int
  Baz: double
}

并像函数调用一样构造它? (也许是let foo = Foo 3 4.5,但这似乎不起作用。)

现在要获得我正在做的功能

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

但我想确保我没有错过任何东西。

谢谢,对不起,如果之前有人询问过这个问题!

4 个答案:

答案 0 :(得分:4)

尚未提及您可以将方法添加到记录类型,如

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

然后像

一样使用它
let foo = Foo.create 3 4.5

(所以你必须为语法工作,但它作为类型的一部分保持良好组织。)

答案 1 :(得分: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,类绝对是更好的选择。

答案 2 :(得分:1)

没有

请注意,有一个称为“类”的好东西,带有一个叫做“构造函数”的东西,看起来它可能适合你的场景。 :)

或者,您始终可以定义函数

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

答案 3 :(得分:0)

我不认为这是可能的 - 我猜想如果你有

会发生什么
type Foo = {
  Bar: int
  Baz: int
}

然后编译器如何知道哪个元素在哪里。