硬编码单元是否有任何技巧进入记录字段而不会丢失漂亮的打印?

时间:2017-06-20 16:49:52

标签: f# f#-data

我希望将单位硬编码到我的记录字段中。目前我有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()

1 个答案:

答案 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;来访问该值。 。