跨类型转换维护计量单位

2023-12-01

如果我们定义一个测量单位,例如:

[<Measure>] type s

然后是带有度量的整数

let t = 1<s>

然后将其转换为浮点数

let r = float t

我们看到r = 1.0没有测量类型。这看起来很奇怪,因为所有测量信息都丢失了。

您可以使用LanguagePrimitives.FloatWithMeasure用类似的东西转换回浮点数

let inline floatMeasure (arg:int<'t>) : (float<'t>) =
    LanguagePrimitives.FloatWithMeasure (float arg)

它强制执行正确的类型,但这感觉不像度量单位的文档(http://msdn.microsoft.com/en-us/library/dd233243.aspx)所说的正确解决方案

但是,为了编写互操作性层,还可以使用一些显式函数将无单位值转换为有单位值。这些位于 Microsoft.FSharp.Core.LanguagePrimitives 模块中。例如,要将无单位浮点数转换为浮点数,请使用 FloatWithMeasure,如以下代码所示。

这似乎表明在 F# 代码中应避免使用该函数。

有没有更惯用的方法来做到这一点?


这是工作片段,它完全满足您的需要,但会发出警告

stdin(9,48):警告 FS0042:此构造已弃用:它仅适用于 F# 库)):

[<NoDynamicInvocation>]
let inline convert (t: int<'u>) : float<'u> = (# "" t : 'U #)

[<Measure>] type s
let t = 1<s>
let t1 = convert t // t1: float<s>

但是,我不建议采用这种方法。
首先,UoM是编译时的,而类型转换的let r = float t是运行时。在调用的那一刻,int -> float不知道是否是int<s> or int<something_else>。所以根本无法推断出正确的float<'u> 在运行时.

另一种想法是,曼彻斯特大学背后的哲学比它所描述的更广泛。这就像对编译器说:“嗯,它是int,但请将其视为int<s>“。目标是避免偶尔的不当使用(例如,添加int<s> to int<hours>).
有时它毫无意义int -> float换算:想到int<ticks>,没有任何感觉float<ticks>.

进一步阅读,感谢 @kvb 指出本文。

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

跨类型转换维护计量单位 的相关文章

  • 将事件绑定到 ItemsControl 中的按钮

    我有一个 Windows Phone 7 应用程序 其中包含一些 xaml 如下所示
  • 带表达式的 F# 类型定义

    是否可以这样表达 type id int gt 0 我知道它不可能静态执行 因为这意味着 F 具有依赖类型 在 C 中 我习惯于使用代码契约来执行此类操作并获得运行时强制执行 我正在这里寻找类似的东西 Thanks 编辑 感谢您提供的所有答
  • 如何编写强制执行复杂模式的 F# 类型提供程序?

    就在最近 我处理了一些交通和旅行信息的数据 即数据Datex2 http www datex2 eu content datex ii xml schema 21格式 该项目时间不长 现在已经结束 我像往常一样继续生成了一堆强类型 C 类x
  • F# 引用的另一个限制?

    今天早些时候 我遇到了 F 引用的限制 并在这里提出了一个问题 F 引号 变量可能会转义作用域 https stackoverflow com questions 6414185 f quotations variable may esca
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • true 和布尔列表 f# 的长度

    直接使用递归 写一个函数truesAndLength bool list gt int int那 返回列表的长度 在该对的第一个组件中 以及列表的数量 列表中正确的元素 在第二个组件中 你的函数必须只迭代 遍历列表的元素一次 请勿使用 Li
  • 了解 F# 尾递归

    最近在学习F 我尝试以不同的方式解决问题 像这样 0 1 2 3 4 5 6 7 8 gt 0 1 2 3 4 5 6 7 8 head recursive let rec toTriplet v1 list match list with
  • 在构建过程中引用自身内部的记录

    我正在尝试创建一条记录 该记录在同一构造函数中使用先前定义的字段之一来计算另一个字段的值 例如 myRecordType Foo int Bar int myRecord Foo 5 Bar Array init Foo fun i gt
  • 如何在R中将英尺转换为厘米?

    我得到了一个高度的字符向量 如下所示 859 5 10 5 8 5 11 6 0 5 10 6 2 5 11 6 2 6 2 5 7 5 9 5 7 6 1 6 0 5 11 6 0 6 5 6 1 6 1 5 10 5 11 5 11 6
  • 从静态成员访问 let 绑定字段

    有没有办法从静态成员访问 let 绑定字段 下面给出了指示的错误 type Foo x let x x static member test let foo Foo System DateTime Now Month printfn A f
  • F# 核心库源代码有一个用于将元组编译为结构的标志,但我无法使其工作

    这是后续问题这个提议 https fslang uservoice com forums 245727 f language suggestions 6148669 short tuples compiled as structs up t
  • 具有异步操作的面向铁路的编程

    以前问过类似的问题 但不知何故我没有找到出路 再次尝试另一个例子 作为起点的代码 稍作修改 可在https ideone com zkQcIU https ideone com zkQcIU 它有一些识别问题Microsoft FSharp
  • 专家 f# 脚本编译奇怪

    第 209 210 页有一个扩展示例 见下文 我使用的是 F 4 5 总之 我不明白的是 如果我单独键入每个语句 则会有一个声明引发错误 如果我立即提交整个脚本 以及引发错误的声明之后的函数 则一切正常 那么 当我批量提交所有语句时 交互中
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • F# 方法返回 null 而不是 Option

    我开发F 应用 net 4 6 1 on VS2015 我有方法 type CommonHelper static member SideEffectOnNull act x if x null then act x else x stat
  • 如何在 F# 测量单位上定义扩展成员?

    暂且不说我们是否应该对像角度这样的无单位概念使用测量单位 假设我已经定义了degree and radianF 中的单位 type
  • 我应该强制使用 F# 测量单位的类型吗? [风格与一般性]

    这个问题与 F 相关计量单位 https learn microsoft com en us dotnet fsharp language reference units of measure 我应该为我正在使用的单元强制执行类型吗 例如
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • 如何在 F# 中实现返回 void 的接口成员

    想象一下 C 中的以下接口 interface IFoo void Bar 我如何在 F 中实现这一点 我在 30 分钟的在线搜索中找到的所有示例都仅显示具有返回类型的示例 我认为这在函数式风格中更常见 但在这种情况下我无法避免 这是我到目
  • Raku mixin 如何与运算符重载配合使用?

    我可以使用一些帮助来确定是否可以通过重载数学运算符来与 mixin 一起使用does or but 以避免下面的歧义错误 该模块 unit module Physics Error role Error is export has Real

随机推荐