首页 文章

带有枚举类型的F#类型约束

提问于
浏览
2

我想编写一个带有泛型枚举值的F#函数,让's say, doubles its underlying integer value. Fortunately, there'是一个名为 int 的内置函数,它将枚举转换为整数,所以这应该很简单,对吧?这是我的第一次尝试:

let doubler (value : 't when 't : enum<int>) =
    2 * (int value)

遗憾的是,这导致以下编译器消息:

Program.fs(2,10):警告FS0064:此构造导致代码不如类型注释所指示的那样通用 . 类型变量't已被约束为类型'int' . Program.fs(2,10):错误FS0071:对类型推断变量应用默认类型“int”时,类型约束不匹配 . 类型“int”不是CLI枚举类型 . 另见Program.fs(1,28) - (1,42) . 考虑添加其他类型约束

我究竟做错了什么?有没有更好的方法从F#中的泛型枚举值中提取底层整数?

1 回答

  • 1

    你需要 EnumToValue .

    open FSharp.Core.LanguagePrimitives
    
    let doubler xEnum =
            2 * EnumToValue(xEnum)
    
    type ColorEnum =    
                | Red=0 
                | Yellow=1 
                | Blue=2
    
    let blue = ColorEnum.Blue
    
    doubler blue
    //val it : int = 4
    

    如果你检查 doubler 的类型签名:

    val doubler:xEnum:'a - > int当'a:enum

    关于你的第一个错误, int 是特殊的,从某种意义上说它也是一个功能 . 正如您所指出的,您可以在枚举中使用基础类型约束,但在这种情况下,请明确说明类型,因此不会产生混淆:

    let double2 (x:'T when 'T:enum<int32>) =
       2 * EnumToValue(x)
    

    不幸的是,如果不使用 EnumToValue ,你仍然无法施放到 int . 可能是编译器问题,或其他 . 也许EnumToValue的内部可以给出一个提示?

相关问题