F# 中测量单位的模式匹配

2023-12-27

这个功能:

let convert (v: float<_>) =
  match v with
  | :? float<m> -> v / 0.1<m>
  | :? float<m/s> -> v / 0.2<m/s>
  | _ -> failwith "unknown"

产生错误

类型“float”没有任何适当的子类型,不能用作类型测试或运行时强制的源。

有什么方法可以匹配度量单位吗?


As @kvb详细解释一下,问题在于度量单位是类型的一部分。这意味着float<m>类型不同float<m/s>(不幸的是,此信息不会作为运行时值的一部分存储)。

因此,您实际上是在尝试编写一个可以处理两种不同类型输入的函数。干净的函数式解决方案是声明一个可区分的联合,它可以保存第一类型或第二类型的值:

type SomeValue = 
  | M of float<m>
  | MPS of float<m/s>

然后你可以使用普通的模式匹配来编写函数:

let convert v = 
  match v with 
  | M v -> v / 0.1<m>
  | MPS v -> v / 0.2<m/s>

您需要将这些值显式包装到可区分的联合值中,但这可能是直接执行此操作的唯一方法(无需对程序结构进行一些较大的更改)。

对于普通类型,例如int and float,您还可以使用重载成员(在某些 F# 类型中声明),但这不适用于度量单位,因为 F# 编译器擦除单位信息后签名将相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 中测量单位的模式匹配 的相关文章

随机推荐

  • 使用 WSE 3.0 添加 SOAP:HEADER 用户名和密码

    我已经成功创建了一个 WS 客户端 该客户端在不使用身份验证时可以正常工作 但是 服务器 WebSphere 现在需要添加 ws security 用户名令牌 而我很难做到这一点 生成的 SOAP 消息应该如下所示
  • 如何将软件版本从 Azure DevOps 部署到内部服务器?

    我们的软件托管在 Azure DevOps 上的 Git 中 并使用构建管道 主要使用 Cake 脚本 进行构建 我们现在希望使用 Azure DevOps 发布管道来部署该软件 然而 我们所有的应用程序服务器都位于防火墙后面 网络内部 除
  • ASP.NET WebPart 和 Google Chrome

    Hi there 这几天开始学习ASP NET Google Chrome 是我的默认浏览器 我也在 Google Chrome 中测试我的应用程序 我发现当我使用 Chrome 时 ASP NET 的某些元素不会实时运行 例如 ASP N
  • 检查对象是否为 Null 或未定义

    我有一个包含可选变量参数的函数 默认情况下 我将变量设置为NULL 但如果不是NULL我希望我的功能可以做一些事情 我需要一种方法来检查变量是否不为空 这很复杂 因为我正在使用 tidyeval 并且只是使用is null var 抛出未找
  • VBA、ADO.Connection 和查询参数

    我有 Excel VBA 脚本 Set c nn CreateObject ADODB Connection conn Open report Set rs conn Execute select from table 脚本工作正常 但我想
  • linux下如何挂载android的img文件? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 最近 我对android rom感兴趣 我想更改和重建它们 所以 我在我的 XOOM 上做了一些测试
  • C++:Cheat Engine 和 ArtMoney 等应用程序如何工作?

    问完后这个问题 C 我可以用指针超出应用程序的内存范围吗 https stackoverflow com questions 2976058 c can i get out of the bounds of my apps memory w
  • 我怎样才能找到这个 Json 对象的长度

    我想找到这个 JSON 对象的长度 所以有人告诉我如何获得 JSON 对象的长度 意味着我想知道这个 json 对象包含多少数据 var ddData 01 United States 02 United Kingdom 03 Aruba
  • 是否有一个函数可以将 ipAddress 作为字符串并告诉我它是否是不可路由的 IP 地址?

    我正在尝试确定 IP 地址是否可路由 例如 如果我收到 127 0 0 1 我就知道这是环回 即 localhost 我无法在 NET 或任何其他语言中找到此功能 因此我开始编写自己的函数 但还远未完成 在我花大量时间编写这个函数之前 有谁
  • 将平铺 Google 地图与 OpenLayers 3 结合使用

    如何将 google 地图与 OpenLayers 3 一起使用 我想从 OpenLayers 2 迁移到 3 这是一个例子 谷歌地图与 OpenLayers 集成示例 http openlayers org en v3 0 0 examp
  • 每天按顺序选择 10 行

    我有一个带有日期 时间戳 记录的数据库 我需要每天选择10条记录 每天还有更多 并按几列对它们进行排序 该查询应该是什么样子 您必须每天在子查询中获取 10 条记录 并通过左连接将它们连接到主表 这样您每天最多可以获得 10 条记录 SQL
  • 错误:“无法修改返回值”c#

    我正在使用自动实现的属性 我想解决以下问题的最快方法是声明我自己的支持变量 public Point Origin get set Origin X 10 fails with CS1612 错误消息 无法修改 表达式 的返回值 因为 它不
  • 在单个查询中从 mongodb 中的 2 个集合中获取数据

    我想从 2 个独立的集合中获取数据并根据date通过单个查询 这甚至可能在mongodb 我有收藏 订单类型1 id 1 name Hello1 date 2016 09 23T15 07 38 000Z id 2 name Hello1
  • Angular:单元测试路由:预期“”为“/route”

    我正在对我的 Angular 应用程序下的路由进行单元测试 我的路线在 app module ts 下导入的特定模块中声明 这是我的路由模块 应用程序路由 module ts import NgModule from angular cor
  • 将 Unicode 转换为 ASCII 而不更改字符串长度(在 Java 中)

    将字符串从 Unicode 转换为 ASCII 而不改变其长度的最佳方法是什么 这对我来说非常重要 此外 没有任何转换问题的字符必须位于与原始字符串相同的位置 因此 必须转换为 A 而不是具有更多字符的神秘内容 Edit novalis 这
  • fseek for fd(int fd 而不是 FILE*)

    fd 是否有相当于 fseek 的功能 我已经使用int fds很长时间了 想使用fseek 但我知道没有seek功能 提前致谢 查看 POSIX 函数lseek 2 http linux die net man 2 lseek SYNOP
  • 如何使用情感 CSS 覆盖 React 组件的 CSS?

    下面的例子说明了如何申请background color green to the
  • 如何创建 4 或 8 连接的邻接矩阵

    我一直在寻找一个 python 实现 给定一个数组 它返回 4 或 8 连接的邻接矩阵 我感到惊讶的是 cv2 或 networkx 不包含此功能 我发现了这个很棒的 Matlab执行 https stackoverflow com a 3
  • WCF 并行模拟

    我有一个带有 ImpersonationOption Required 的 WCF 服务 使用并行性时 模拟似乎不会流动 例如 Parallel ForEach items gt results Add SystemUtil Windows
  • F# 中测量单位的模式匹配

    这个功能 let convert v float lt gt match v with float