与受歧视的联盟相匹配

时间:2011-02-21 11:10:44

标签: 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.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; 
        }
    }

有人可以帮帮我吗?

提前致谢,

格特 - 扬

2 个答案:

答案 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或一些有冲突的名字时使用它)。