gpt4 book ai didi

f# - 是否有任何技巧可以在不丢失 pretty-print 的情况下将单元硬编码到记录字段中?

转载 作者:行者123 更新时间:2023-12-02 04:34:41 24 4
gpt4 key购买 nike

我希望将单元硬编码到我的记录字段中。目前,我重写了 ToString() 方法并使用了 [StructuredFormatDisplay("{AsString}")] 属性。这已经奏效了,除了不幸的是我丢失了 FSharp 在该记录嵌套到的类型上的 pretty-print (主要是偏移)。话虽如此,我想知道是否有人知道实现此目的的任何技巧。

基本上我有这种类型:

type SteelMaterial =
{Fy : float<ksi>;
Fu : float<ksi>;
E : float<ksi>;}

并希望它像这样打印出来:

SteelMaterial = {Fy = 50.0 <ksi>;
Fu = 60.0 <ksi>;
E = 29000.0 <ksi>;}

像这样,当嵌套时:

Section = {Section = "Section 1";
Material = {Fy = 50.0 <ksi>;
Fu = 60.0 <ksi>;
E = 29000.0 <ksi>;};
Transformations = null;}

我希望这样做的原因是在通过 F# 格式化(通过 (*** include-value: mySection **))、Ifsharp 或 Azure Notebooks 生成计算时记录单位。

更新

我最初没有包含我的实现,因为我认为它不会使问题更加清晰。如果有人想知道,这里是。

[<StructuredFormatDisplay("{AsString}")>]
type SteelMaterial =
{
Fy : float<ksi>
Fu : float<ksi>
E : float<ksi>
}

static member create (Fy, Fu, E) =
{Fy = Fy; Fu = Fu; E = E}

override this.ToString() =
sprintf "Steel Material =\r\n{Fy = %f <ksi>;\r\nFu = %f <ksi>;\r\nE = %f <ksi>;}"
this.Fy this.Fu this.E

member this.AsString = this.ToString()

最佳答案

看起来我可以通过将单元包装在 DU 中并覆盖 ToString() 方法来获得我正在寻找的东西。

[<Measure>] type ksi

[<StructuredFormatDisplay("{AsString}")>]
type Ksi =
| Ksi of float<ksi>

override this.ToString() =
match this with
| Ksi value -> System.String.Format("{0:0.0####} <ksi>", value)

member this.AsString = this.ToString()

member this.ksi =
match this with
| Ksi value -> value


type SteelMaterial =
{Fy : Ksi;
Fu : Ksi;
E : Ksi;}

let mySteelMaterial =
{Fy = Ksi(50.0<ksi>);
Fu = Ksi(60.0<ksi>);
E = Ksi(29000.0<ksi>)}

这有一些好处,包括能够在 Ksi 类型上进行模式匹配和打印我正在寻找的单位。缺点是 DU 中包装值带来的缺点,其中包括用户需要键入 Ksi(10.0<ksi>)这不太简洁,然后需要通过“.ksi”访问该值。

关于f# - 是否有任何技巧可以在不丢失 pretty-print 的情况下将单元硬编码到记录字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44658887/

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