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

第一次使用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; 
        }
    }
有人能帮我吗

提前感谢,


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#包装类)