gpt4 book ai didi

f# - 使用 F# 测量单位将 m/s 转换为 km/h

转载 作者:行者123 更新时间:2023-12-03 05:47:15 26 4
gpt4 key购买 nike

我正在学习 F# - 目前正在研究度量单位。我有一个返回米每秒的简单计算,我想引入一个将其转换为公里每小时的函数。

我的代码如下所示:

[<Measure>] type kg
[<Measure>] type s
[<Measure>] type m
[<Measure>] type km
[<Measure>] type h

let msToKmph(speed : float<m/s>) =
(float speed) * 3.6<km/h>

let gravityOnEarth = 9.81<m/s^2>
let heightOfJump = 3.5<m>

let speedOfImpact = sqrt (2.0 * gravityOnEarth * heightOfJump)
let speedOfImpactKmh = msToKmph(speedOfImpact)

这有效 - 我得到 8.28673639 m/s 和 29.832251 km/h。我不确定这是否是表达不同单位之间关系的最佳方式。这可以做得更优雅吗?

例如,该行执行(float speed)从速度参数中删除单位信息,以使 msToKmph 返回 km/h。如果我在计算之前没有删除单位信息,则返回的单位将为:km m/(h s)

最佳答案

首先,你的msToKmph是完全错误的。虽然它返回了正确的返回值,但它实际上在做什么,是不是只是丢弃原来的<m/s>值通过转换为简单的、无量纲 float然后将无量纲值乘以 3.6<km/h> .

为了更好地表达 UoM 之间的关系,请考虑以下内容:

let kmToM = 1000.0<m/km>  // relation between kilometers and meters
let hrToSec = 3600.0<s/h> // relation between seconds and hours
let msToKmph(speed : float<m/s>) =
speed / kmToM * hrToSec

请注意,所有“魔数(Magic Number)”都封装在计量单位转换器中,因此您的公式保持干净,例如它们只是简单地操作值和常量,但计量单位是由编译器计算的。

更新:计量单位转换的理念是转换公式应该具有物理意义。经验法则是您的转化值(value)是否出现在引用书中。用简单的英语来说,3.6<km/h>从上面看是没用的,但是1000.0<m/km>只是说“1 km 等于 1000 m”,这是有道理的。

您甚至可以改进hrToSec像这样:

let hrToSec2 = 60.0<s/minute> * 60.0<minute/h>

这将使每个值都成为引用书中众所周知的值。

关于f# - 使用 F# 测量单位将 m/s 转换为 km/h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13822066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com