3

第一次使用 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 和 sales 输入,我只是在这里省略了公式。)

我想要做的是使用有区别的联合,就像我在 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; 
        }
    }

有人可以帮我吗?

提前致谢,

格特-扬

4

2 回答 2

6

您调用了构造函数Corp_SME,但尝试将其与CORP_SME(全部大写)匹配。由于这不是任何构造函数的名称,F#因此假设它是一个变量名称(因此是关于大写变量名称的警告),它当然会匹配以前未匹配的所有内容(因此是随后的警告)。

于 2011-02-21T11:16:39.357 回答
2

作为旁注,您还可以enum在 F# 中声明类型。为此,您只需将一些整数值添加到类型的案例中:

type AssetClass = 
    | Corp = 0
    | Corp_SME = 1
    | Res_Mort = 2
    | Qual_Ret = 3 
    | Ret_Oth = 4

要使用enumin 模式匹配,您必须使用完全限定名称,这样您就不会意外得到您遇到的问题 - 您必须编写| AssetClass.Corp -> ...

如果您使用[<RequireQualifiedAccess>]属性注释类型,您也可以为通常的可区分联合获得此行为。这可能是一个好主意,因为您不会污染命名空间(但我仅在有太多 DU 或一些冲突名称时才使用它)。

于 2011-02-21T11:23:07.350 回答