在Deedle数据框中的漂亮打印

时间:2016-03-22 02:04:08

标签: f# f#-interactive deedle

我想知道是否有一种简单的方法可以将漂亮的打印添加到Deedle数据框中使用的自定义类型。

在以下示例中:

open Deedle

type PrimaryContactInfo =
    | Default of int
    | NonDefault of int
    | Missing

type Account = { PrimaryContact : PrimaryContactInfo }

[ { PrimaryContact = Default(1) }; { PrimaryContact = Default(2) }; { PrimaryContact = NonDefault(5) } ]
|> Frame.ofRecords

我在fsi中得到以下输出:

     PrimaryContact                         
0 -> FSI_0011+PrimaryContactInfo+Default    
1 -> FSI_0011+PrimaryContactInfo+Default    
2 -> FSI_0011+PrimaryContactInfo+NonDefault 

但我宁愿输出如下:

     PrimaryContact                         
0 -> Default(1)    
1 -> Default(2)   
2 -> NonDefault(5)

这可能吗?

1 个答案:

答案 0 :(得分:4)

正如this language feature suggestion暗示的那样,F#受歧视的工会不会自动转换为字符串。

您可以通过覆盖ToString来完美转换:

type PrimaryContactInfo =
    | Default of int
    | NonDefault of int
    | Missing
    override this.ToString () = sprintf "%A" this

但请注意,"%A"的使用可能,因此请测量,并在必要时编写更快,更明确的实现;例如:

type PrimaryContactInfo =
    | Default of int
    | NonDefault of int
    | Missing
    override this.ToString () =
        match this with
        | Default i -> sprintf "Default %i" i
        | NonDefault i -> sprintf "NonDefault %i" i
        | Missing -> "Missing"

这产生与sprintf "%A完全相同的输出,但是没有使用反射,理论上 应该更快(但不要接受我的话)在它上面:衡量)。