是否有可能采取类似的记载:通过位置参数
type Foo = {
Bar: int
Baz: double
}
,构建它像一个函数调用? (也许let foo = Foo 3 4.5
,但似乎并没有工作。)
现在得到这个功能我做
let createFoo bar baz = { Bar = bar; Baz = baz }
但我想确保我不缺少的东西。
谢谢,对不起,如果这已经问过!
是否有可能采取类似的记载:通过位置参数
type Foo = {
Bar: int
Baz: double
}
,构建它像一个函数调用? (也许let foo = Foo 3 4.5
,但似乎并没有工作。)
现在得到这个功能我做
let createFoo bar baz = { Bar = bar; Baz = baz }
但我想确保我不缺少的东西。
谢谢,对不起,如果这已经问过!
没有提到的是,你可以添加一个方法来记录类型像
type Foo = {
Bar: int
Baz: double
}
with
static member create bar baz =
{Bar=bar; Baz=baz}
,然后用它像
let foo = Foo.create 3 4.5
(所以你必须对语法的工作,但它保持良好的组织类型的一部分)。
我不认为这是可能的 - 我的猜测,为什么会是,如果你有
type Foo = {
Bar: int
Baz: int
}
那么编译器如何知道哪个元素去的地方会发生什么。
号
注意,有一个叫“类”与被称为“构造”,似乎像它可能适合您的方案事情一件很棒的事情。 :)
或者,你总是可以定义
let mkFoo x y = { Bar=x; Baz=y }
前面已经提到的功能,记录只能使用记录施工语法创建的。另一种使用记录(除了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,类绝对是更好的选择。
替代方案存在于问题中 – manojlds