什么是亲的和使用的反对的两种记录VS单案例识别联合
type Complex =
{
real: float;
imag: float;
}
或
type Complex =
Complex of
real: float *
imag: float
我在可读性特别感兴趣,并在处理不同的情况。
在较小的程度上,性能。
什么是亲的和使用的反对的两种记录VS单案例识别联合
type Complex =
{
real: float;
imag: float;
}
或
type Complex =
Complex of
real: float *
imag: float
我在可读性特别感兴趣,并在处理不同的情况。
在较小的程度上,性能。
使用助手函数,您可以从两种方法中获得相同的结果。
记录
type ComplexRec =
{
real: float
imag: float
}
// Conciseness
let buildRec(r,i) =
{ real = r ; imag = i }
let c = buildRec(1.,5.)
// Built-in field acces
c.imag
联盟类型
type ComplexUnion =
Complex of
real: float * imag: float
// Built-in conciseness
let c = Complex(1.,5.)
// Get field - Could be implemented as members for a more OO feel
let getImag = function
Complex(_,i) -> i
getImag c
我想象中的联合类型的(频繁)的分解会影响性能,但是我没有关于该问题的专家。
整洁!所以本质上你说: 杜:容易编写,但“难”分解。 rec:“很难”组成,但容易分解 (不诉诸帮助者funcs) – 3dGrabber
对于单个案例联盟的性能不应该改变。 – FuleSnabel
在记录类型的情况下,让我们说,你声明的符号it : Complex
你有一个像立即访问这两个领域:it.real, it.imag
在识别联合(DU),您必须首先解杜类型等的情况:
match it with
| Complex (real, imag) -> real, imag
DU在您对类型有一些选择时很有意义。您的复杂类型不支持少数情况,它只有一种可能的形状。
在这种情况下,我赞成记录类型,因为它在使用中提供更多可读代码。
请注意,对于单个案例联盟,您不需要'match'来解开它。 – FuleSnabel
在F#4.1的性能上,您可以考虑添加'[]' –
FuleSnabel
正如我们所说的复数DU带来的好处是DU可以有两种情况'矩形'和'极坐标'。 – FuleSnabel