f# - 我应该强制使用 F# 测量单位的类型吗? [风格与一般性]

标签 f# units-of-measurement

此问题与 F# units of measure 相关.

我应该为我正在使用的单元强制执行类型吗?

例如,我应该强制要求秒始终是 float 吗?

let asSeconds time = float(time)*1.0<second>

这似乎有点限制,因为 NASA 可能想使用十进制。另一方面,我不知道如何转换通用 a'成一个单元a'<seconds> 。我面临的问题是一些应用程序级别的函数不使用单位,但一些库的东西确实使用单位。

附注这与我的previous question有轻微关系

最佳答案

should I enforce that seconds are always a float?

我认为您无法真正强制执行此操作,因为测量单位本质上并不与特定的数字类型相关。例如,以下两者都是合法的:

let a = 1<second>     // a : int<second>
let b = 1.0<second>   // b : float<second>

I don't know how to convert a generic 'a into a unit 'a<seconds>.

这是一个有趣的问题,但我认为不可能编写 asSeconds 的通用版本,因为度量单位只能应用于文字,而文字在 F# 中从来都不是通用的。所以你不能写time<second>time * GenericOne<second> .

底线,从无量纲值转换为有量纲值时,您必须选择特定的数字类型,例如 float 。但这并不意味着您可以强制该 UOM 的所有值都具有该数字类型。

关于f# - 我应该强制使用 F# 测量单位的类型吗? [风格与一般性],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71642273/

相关文章:

php - 如何在 PHP Web 应用程序中管理度量单位?

ios - 确定系统的距离单位

f# - 聚合非规范化数据的惯用方式

f# - 在 F# 中绘制图表并比较价格 - Chart.Combine 将不会生成图表

algorithm - 树状结构中的递归

types - 有没有办法在 OCaml 类型系统中嵌入单元处理逻辑?

selenium - 如何折叠 F# 中受歧视联合的匹配项

f# - 使用 Foq 模拟 Microsoft.Extensions.Logging.ILogger

naming-conventions - 为编程中的计算保留单位

sass - 是否可以将(动态)单位添加到 sass 中的无单位数字?