2017-04-06 64 views
4

什么是亲的和使用的反对的两种记录VS单案例识别联合

type Complex = 
    { 
     real: float; 
     imag: float; 
    } 

type Complex = 
    Complex of 
     real: float * 
     imag: float 

我在可读性特别感兴趣,并在处理不同的情况。
在较小的程度上,性能。

+0

在F#4.1的性能上,您可以考虑添加'[]' – FuleSnabel

+0

正如我们所说的复数DU带来的好处是DU可以有两种情况'矩形'和'极坐标'。 – FuleSnabel

回答

4

使用助手函数,您可以从两种方法中获得相同的结果。

记录

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 

我想象中的联合类型的(频繁)的分解会影响性能,但是我没有关于该问题的专家。

+1

整洁!所以本质上你说: 杜:容易编写,但“难”分解。 rec:“很难”组成,但容易分解 (不诉诸帮助者funcs) – 3dGrabber

+0

对于单个案例联盟的性能不应该改变。 – FuleSnabel

3

在记录类型的情况下,让我们说,你声明的符号it : Complex你有一个像立即访问这两个领域:it.real, it.imag

在识别联合(DU),您必须首先解杜类型等的情况:

match it with 
| Complex (real, imag) -> real, imag 

DU在您对类型有一些选择时很有意义。您的复杂类型不支持少数情况,它只有一种可能的形状。

在这种情况下,我赞成记录类型,因为它在使用中提供更多可读代码。

+0

请注意,对于单个案例联盟,您不需要'match'来解开它。 – FuleSnabel