我希望将单位硬编码到我的记录字段中。目前我有ToString()方法覆盖并使用[StructuredFormatDisplay(“{AsString}”)]属性。这是有效的,除了不幸的是我丢失了FSharp在该记录嵌套的类型上的漂亮打印(主要是抵消)。话虽如此,我想知道是否有人知道要做到这一点的任何技巧。
基本上我有这种类型:
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笔记本进行计算时记录单位。
我最初没有包括我的实施,因为我认为它没有增加问题的清晰度。在这里,如果有人想知道。
[<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()
答案 0 :(得分:0)
看起来我可以通过将单元包装在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>)
并且不太简洁,然后需要通过&#34; .ksi&#34;来访问该值。 。