F# - 重量(计量单位)英石-磅

标签 f# units-of-measurement

我有一个包含每日体重的 csv 文件,如下所示:

Date,Name,Weight
11-Sep-2017,Alpha,9-1
13-Sep-2017,Alpha,8-13
15-Sep-2017,Alpha,8-11

虽然我可以使用 CsvProvider 成功导入它们,但权重列默认为 System.DateTime。

    // Weight
    [<Measure>] type lb

    [<Literal>]
    let input = "DayWeights.csv"
    type Weights = CsvProvider<input, HasHeaders=true>

    let data = Weights.GetSample()
    for row in data.Rows do
        printfn "Output: (%A, %A, %A)" row.Date row.Name row.Weight

是否可以创建一个计量单位 (UoM) 来定义“STLb”,并可选择在导入时转换为磅,如果可以,如何转换?

最佳答案

我认为您不能将石磅表示为单个数字类型,并且度量单位只能用于数字类型(尽管 some discussion 关于将来更改此设置)。这是因为它们的某些功能仅对加法和乘法等数字运算有意义。单位本身相乘和相除:

[<Measure>] type lb
2<lb> + 2<lb> // 4<lb>
2<lb> * 2<lb> // 4<lb ^ 2>
2<lb> / 2<lb> // 1

如果您希望某种类型的标签知道给定值具有石磅类型,而不是测量单位,则可以创建一个区分大小写的联合:

type StonesPounds = StonesPounds of int * int

// StonesPounds -> int<lb>
let convertToLb (StonesPounds (s, p)) = (s * 14 + p) * 1<lb>

StonesPounds (1, 2) |> convertToLb // 16<lb>

与度量单位相比,其缺点是您必须在代码中手动打包和解包这些值,然后才能使用这些数字,并且这也会产生运行时成本。

关于F# - 重量(计量单位)英石-磅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46726271/

相关文章:

f# - 选择列的子集(即通过列键的集合过滤数据框)

F#:让可变与引用

f# - 我什么时候需要调用 "ConvertToGenerated"成员来使用类型提供程序生成类型

wolfram-mathematica - 如何在 Mathematica 中使用函数参数值的单位

java - Scala UOM 库

wpf - 不可变状态 - 有效地将更改传播到 GUI

f# - 异步/并行组合

css - 将 Photoshop 中设置的字母跟踪值转换为 CSS 中的等效字母间距

delphi - 在 Delphi 中,跨单元使用类型定义时出现问题

css - 字体大小 1px 与 rem 单位一起使用