替换单个案例区分工会的一项的价值?

时间:2018-09-20 20:49:47

标签: f#

看到我有一个区分案件的工会

type R = R of string * int * sting option * .....

我得到的值为R

let r: R = getAValue ()

现在,我需要将r的第一项替换为空字符串,并保留所有其他值。怎么做?记录类型具有with构造

let r' = { r with Item1 = "" }

我知道它可以使用“模式匹配”来提取所有项目并创建一个新项目。但这似乎很麻烦。

1 个答案:

答案 0 :(得分:3)

我假设您不想参与反思,是吗?

然后,我相信您唯一的选择是使用模式匹配。 (相当有限的)负担是将类型r-ity的{​​{1}}定义为匹配模式。

例如,假设您的R包装了3个元素的元组,即具有r-ity 3:

R

在这种情况下,您需要定义以下功能:

type R = R of string * int * string option

let modR = function | R(x,y,z) -> R("",y,z) 的签名为modR,可快速检查您的情况:

R -> R

在fsi中带回了

let r = R("abc",1,None)
modR r

将以上内容应用于特定的> val it : R = R ("",1,None) 所需要的全部就是将类型的实际比例设置为模式。

更新: 正如Fyodor Soikin所指出的,解开单个大小写的DU根本不需要匹配函数(请参见{{3} }。所寻求的转换函数定义可以定义为简单

R

UPDATE2: 在考虑来自docs的评论时,我回想起另一种模式匹配,即ca9163d9。在以DU成员的形式实现所需的转换时使用它可以得出:

let modR (R(_,y,z)) = R("",y,z)

@FyodorSoikin和@kaefer也在注释中指出,简单的DU展开不需要type R = R of string * int * string option with member self.modR() = let R(_,b,c) as x = self in R("",b,c) 形式,类似于上面的Terser as x函数定义:

modR