看到我有一个区分案件的工会
type R = R of string * int * sting option * .....
我得到的值为R
。
let r: R = getAValue ()
现在,我需要将r
的第一项替换为空字符串,并保留所有其他值。怎么做?记录类型具有with
构造
let r' = { r with Item1 = "" }
我知道它可以使用“模式匹配”来提取所有项目并创建一个新项目。但这似乎很麻烦。
答案 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