f# - 替换单例判别并集的一项值?
问题描述
见我有一个单案歧视工会
type R = R of string * int * sting option * .....
我得到了R
.
let r: R = getAValue ()
现在我需要将第一项替换为r
空字符串并保留所有其他值。怎么做?记录类型具有with
构造
let r' = { r with Item1 = "" }
我知道它可以使用“模式匹配”来提取所有项目并创建一个新项目。但这似乎很麻烦。
解决方案
我假设您不想涉及反思,是吗?
然后,我相信您唯一的选择是使用模式匹配。(相当有限的)负担将定义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)
modR
is的签名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)
推荐阅读
- angular - 如何向 ng-template 添加属性?
- r - 在 r 中将数据框写为 excel 表
- many-to-many - NestJs 使用连接表更新多对多关系
- android - PopupWindow 在屏幕底部被截断
- python - 如何从scrapy中的csv文件中读取start_urls?
- android - 如何使用 Android 版本构建具有更高 minSdkVersion 的排毒测试 - - React-Native
- angular - 有没有办法将服务或返回类型注入到路由解析器中?
- json - Python pandas,如何以最有效的方式将带有json的pandas列解压缩到新的数据框?
- react-native - 我们可以通过原生反应从移动设备中获得的最独特的东西
- c# - 有没有办法在我的显示 api 内容的 uwp listview 上获取过滤器