F# 歧视性工会
第一次使用F#进行生产,需要一些帮助。请参阅以下代码,其中我在每行添加了作为注释得到的警告:F# 歧视性工会,f#,enums,pattern-matching,discriminated-union,F#,Enums,Pattern Matching,Discriminated Union,第一次使用F#进行生产,需要一些帮助。请参阅以下代码,其中我在每行添加了作为注释得到的警告: type AssetClass = | Corp | Corp_SME | Res_Mort | Qual_Ret | Ret_Oth let Correlation assetClass pd sales = match assetClass with | Corp -> 0.12 | CORP_SME -> 0.2
type AssetClass =
| Corp
| Corp_SME
| Res_Mort
| Qual_Ret
| Ret_Oth
let Correlation assetClass pd sales =
match assetClass with
| Corp -> 0.12
| CORP_SME -> 0.24 // warning FS0049: Uppercase variable identifiers
| Res_Mort -> 0.15 // warning FS0026: This rule will never be matched
| Qual_Ret -> 0.04 // warning FS0026: This rule will never be matched
| Ret_Oth -> 0.03 // warning FS0026: This rule will never be matched
我查过了,这不是在虚张声势,第三个和其他案例都被忽略了。我在这里没有得到什么?(我在实际实现中使用的pd和销售输入,我只是在这里省略了公式。)
我要做的是像在C#中使用枚举一样使用区分并集,然后打开它。因此,在C#中,我会键入以下内容:
enum AssetClass {
Corp,
Corp_SME,
Ret_Oth
}
float Correlation(AssetClass assetClass){
switch(assetClass){
case Corp: return 0.12;
case Corp_SME: return 0.12;
case Ret_Oth: return 0.12;
}
}
有人能帮我吗
提前感谢,
Gert Jan你给你的构造器打了电话
Corp\u SME
,但试着把它和Corp\u SME
匹配起来(全部大写)。由于这不是任何构造函数的名称,F#
假定它是一个变量名(因此是关于大写变量名的警告),它当然会匹配之前未匹配的所有内容(因此是后续警告)。作为旁注,您还可以在F#中声明enum
类型。为此,只需向类型的大小写中添加一些整数值:
type AssetClass =
| Corp = 0
| Corp_SME = 1
| Res_Mort = 2
| Qual_Ret = 3
| Ret_Oth = 4
要在模式匹配中使用enum
,您必须使用完全限定名,这样您就不会意外地遇到问题-您必须编写|AssetClass.Corp->…
如果使用
[]
属性对类型进行注释,则对于常见的有区别的联合,也可以获得此行为。这可能是个好主意,因为您不会污染名称空间(但我只在DU太多或名称冲突时才使用它)。嗨,托马斯,谢谢!作为澄清,如果我添加整数,它实际上将是一个.Net枚举,因此我可以在C#项目中使用它?如果我不加整数,而是保持代码不变,那会得到什么呢?执行此操作的原因是什么?@gjvdkamp是的,如果添加整数,它将从C#变为可用的enum
。如果不添加它们,它将是F#判别并集,这比C#更难使用(它有一个标记
属性,它是一些枚举
)。F#使用不同表示法的原因是,您可以使用带有值的大小写(例如,|Corp of int
)。嗨,托马斯,感谢我使用reflector查看了生成的代码,没有指定整数会导致一些非常不同的东西,其中包含嵌套类,用于与大量代码的并集。将坚持指定int值。再次感谢@gjvdkamp:是的,区分并集的每个案例都被编译成一个继承类(一个案例可能有不同的属性,因此DU被表示为类层次结构)。在编写普通F#时,您不必担心这一点,但如果您想从C#使用它,最好公开更好的API(例如,使用F#enum或编写带有成员的F#包装类)