我想编写一个 F# 函数,它采用通用枚举值,并且将其基础整数值加倍。幸运的是,有一个内置函数叫做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# 中的通用枚举值中提取基础整数?
你需要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 when 'a : enum
关于你的第一个错误,int
很特殊,从某种意义上说它也是一个函数。正如您所指出的,您可以在枚举中使用基础类型约束,但在这种情况下要明确类型,这样就不会造成混淆:
let double2 (x:'T when 'T:enum<int32>) =
2 * EnumToValue(x)
不幸的是,您仍然无法投射到int
不使用EnumToValue
。可能是编译器问题,或者其他问题。也许 EnumToValue 的内部结构可以给出提示?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)