首页 > 解决方案 > 替换单例判别并集的一项值?

问题描述

见我有一个单案歧视工会

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

我得到了R.

let r: R = getAValue ()

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

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

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

标签: f#

解决方案


我假设您不想涉及反思,是吗?

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

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

type R = R of string * int * string option

在这种情况下,您只需定义以下函数:

let modR = function
| R(x,y,z) -> R("",y,z)

modRis的签名R -> R,快速检查您的场景:

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

在 fsi 中带回

> 
val it : R = R ("",1,None)

将上述内容应用于您的具体情况所需的R只是将您的类型的实际 r-ity 设置为模式。

更新:正如Fyodor Soikin 所指出的,解包单例 DU 根本不需要匹配函数(请参阅文档)。所寻求的转换函数定义可以简单地定义为

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

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

type R = R of string * int * string option with
    member self.modR() = let R(_,b,c) as x = self in R("",b,c)

@FyodorSoikin 和 @kaefer 在评论中指出,as x简单的 DU 展开不需要 form ,类似于上面的 tersermodR函数定义:

    member self.modR() = let (R(_,b,c)) = self in R("",b,c)

推荐阅读