首次使用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.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;
}
}
有人可以帮帮我吗?
提前致谢,
格特 - 扬
答案 0 :(得分:6)
您调用了构造函数Corp_SME
,但尝试将其与CORP_SME
(全部大写)匹配。由于这不是任何构造函数的名称,F#
假设它是一个变量名(因此是关于大写变量名的警告),然后当然匹配之前未匹配的所有内容(因此后续警告)。
答案 1 :(得分:2)
作为旁注,您还可以在F#中声明enum
类型。为此,您只需在类型的情况下添加一些整数值:
type AssetClass =
| Corp = 0
| Corp_SME = 1
| Res_Mort = 2
| Qual_Ret = 3
| Ret_Oth = 4
要在模式匹配中使用enum
,您必须使用完全限定名称,这样您就不会意外地解决问题 - 您必须编写| AssetClass.Corp -> ...
如果使用[<RequireQualifiedAccess>]
属性注释类型,也可以为通常的区分联合使用此行为。这可能是一个好主意,因为你没有污染命名空间(但我只在我有太多的DU或一些有冲突的名字时使用它)。