F# 具有 Enum 类型的类型约束

2024-02-28

我想编写一个 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(使用前将#替换为@)

F# 具有 Enum 类型的类型约束 的相关文章

随机推荐

  • 如何分析Websphere core*.dmp 文件和Snap*.trc 文件?

    全部 我的应用程序在 websphere 应用程序服务器 7 0 上运行 我得到了一些核心转储和跟踪文件 例如 核心 20110909 164930 3828 0001 dmp and 快照 20110909 164930 3828 000
  • 使用 Flash、PHP、Red5 从浏览器录制视频

    我希望构建一个应用程序 使用它可以录制视频 以及音频 和音频 最好仅录制 mp3 格式的音频 根据我所做的一些研究 我发现我需要一个 Flash 或 Flex 客户端应用程序 一个 RTMP 服务器 RED5 最好 因为它是免费的 这是我用
  • 加载时重置缩放级别

    我没有 iPhone 所以无法自己测试这一点 但根据客户的说法 如果他放大以更轻松地单击链接 那么当下一页加载时 页面会保持放大状态 而用户必须手动缩小再次 请注意 这不是响应式网站 它没有设置元宽度 设备宽度 有什么办法可以防止这种情况发
  • 何时调用obtainPermanentIDsForObjects:?

    我目前遇到一个问题 即在后台子线程 其父级是主 UI 线程上下文 上创建新对象并保存会导致我的NSFetchedResultsController显示两个新对象 一个带有临时对象objectID 以及一个具有永久objectID 这似乎是某
  • 在 Chrome 中将焦点设置在 iframe 上

    我有一个 iframe id chat with designMode on 在 Chrome 中 在 Enter 按键事件上我调用该函数send 它获取 iframe 内容并将其写入套接字 我的问题是 当清除 iframe 时 我失去了焦
  • 开发流程、部署、GitHub

    我正在努力为我们的团队制定一个开发流程 任何时候 我们都有 3 4 分散的开发人员在我们的代码库上工作 我们已经开始使用 GIT 我们的想法是 工作不仅仅是实时修复 然后他们分叉了 master 分支 每个人在服务器上都有自己的开发环境 并
  • 函数数组和分段错误 - 无效的内存引用

    我正在尝试设置我的功能f作为数组 但我收到以下错误 Program received signal SIGSEGV Segmentation fault invalid memory reference Backtrace for this
  • C# UDP广播和接收示例

    问题 我正在尝试将 udp 套接字绑定到特定地址 我会广播一条消息 同一个套接字需要能够接收消息 当前代码 static void Main UdpClient Configuration new UdpClient new IPEndPo
  • gnuplot - 彩色刻度线

    有什么办法可以拥有gnuplot为 x 和 或 y 轴上的刻度线着色 我正在使用背景png文件非常暗 我希望内部抽动在其上显示为白色 而不是默认的黑色 The tics似乎继承了它们的颜色border set style line 50 l
  • Typescript:推断嵌套 keyof 属性的类型

    我想定义一个数组类型 它必须包含给定类型的嵌套属性名称链 假设我有一个类型 type Foo outer inner any 现在我想定义一个包含 2 个元素的数组类型 type PropertyList
  • SQL 查询的 NULL NOT IN (Empty_Relation) 在不同引擎上显示不同的行为

    我尝试在 Postrgresql Spark 上测试 NULL NOT IN Empty Relation 的查询 得到了不同的结果 select count from select 1 where null not in a empty
  • React js 输入复选框组

    是否可以在反应中创建输入复选框组 如果我映射了 3 个复选框 但只能单击其中一个 我是否只给每个状态一个状态 当选择一个状态后 然后取消选中其他状态 我已经尝试过无线电输入 但我需要能够将它们全部取消选中 就像在无线电组中一样 一旦您选择了
  • python pywin32 拒绝 Excel 访问

    我的代码是 Opens template for creating final report excel win32 dynamic Dispatch Excel Application template os path abspath f
  • R:具有两个变量和 ties.method random 的排名函数

    R中有没有一种方法可以使用带有多个条件和ties method的rank函数 或类似的函数 通常 排名用于对向量中的值进行排名 如果存在联系 您可以使用其中一种联系方法 平均 随机 第一 但是当对矩阵中的一列进行排名时 我想使用多列and关
  • 在 SWI-Prolog 中打开并检查 Pem 文件

    如何打开 Pem 文件来检查 a 不早于 和 不晚于 日期是否正常 以及 b pem 文件中是否存在通往路由证书颁发机构的证书链 我努力了 use module library http http client url http fm4dd
  • 对 STRUCT 数据类型使用 Like 运算符

    我有一个包含结构数组的表 有没有办法使用 like 运算符过滤此列中的记录 hive gt desc location location list array
  • 如何更改 RichTextBox 段落间距?

    我在 WPF 中使用 RichTextBox 并尝试将默认段落间距设置为 0 这样就没有段落间距 虽然我可以在 XAML 中执行此操作 但如果可能的话 我希望以编程方式实现它 有任何想法吗 我做到了有风格 双关缩进
  • jQuery 验证插件:验证以逗号作为小数分隔符的小数

    HTML
  • 为什么评估集会耗尽 pytorch 拥抱中的内存?

    我使用的是相当大的 GPU 大约 80 GB 训练纪元运行良好 但由于某种原因在评估时 训练集和验证集或多或少具有相同的长度 我内存不足并收到此错误 File home transformers trainer pt utils py li
  • F# 具有 Enum 类型的类型约束

    我想编写一个 F 函数 它采用通用枚举值 并且将其基础整数值加倍 幸运的是 有一个内置函数叫做int将枚举转换为整数 所以这应该很容易 对吧 这是我的第一次尝试 let doubler value t when t enum