Матч на дискриминируемом союзе - PullRequest
3 голосов
/ 21 февраля 2011

Использование 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, которые я использую в реальной реализации, я здесь просто пропустил.)

Я хочу использовать дискриминационное объединение, как я бы использовал enum в 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 ]

6 голосов
/ 21 февраля 2011

Вы назвали свой конструктор Corp_SME, но попробуйте сопоставить его с CORP_SME (все заглавные буквы).Поскольку это не имя какого-либо конструктора, F# предполагает, что это имя переменной (таким образом, предупреждение о именах переменных в верхнем регистре), что, конечно, соответствует всему, что ранее не совпадало (таким образом, последующие предупреждения).

2 голосов
/ 21 февраля 2011

В качестве дополнительного примечания, вы также можете объявить enum типы в F #.Чтобы сделать это, вы просто добавляете несколько целочисленных значений в регистры типа:

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

Чтобы использовать enum в сопоставлении с образцом, вам необходимо использовать полностью определенное имя, чтобы вы не могли случайно получитьпроблема, с которой вы столкнулись - вы должны написать | AssetClass.Corp -> ...

Вы также можете получить это поведение для обычных различаемых объединений, если вы аннотируете тип с атрибутом [<RequireQualifiedAccess>].Это, вероятно, хорошая идея, поскольку вы не загрязняете пространство имен (но я использую его только тогда, когда у меня слишком много DU или несколько конфликтующих имен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...