Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何使用printf自定义自定义类型的输出?_F#_Printf_String Formatting_F# Interactive - Fatal编程技术网

F# 如何使用printf自定义自定义类型的输出?

F# 如何使用printf自定义自定义类型的输出?,f#,printf,string-formatting,f#-interactive,F#,Printf,String Formatting,F# Interactive,我已经阅读了大量的专家F#,正在构建一个实际的应用程序。在调试过程中,我已经习惯于像这样传递fsi命令,以使repl窗口中的内容清晰可见: fsi.AddPrinter(fun (x : myType) -> myType.ToString()) 我想将其扩展到使用printf格式化程序,这样我就可以键入 printf "%A" instanceOfMyType 和控制自定义类型的输出。这本书暗示这是可以做到的(第93页,“通用结构格式可以扩展到任何用户定义的数据类型, 这是F#网站

我已经阅读了大量的专家F#,正在构建一个实际的应用程序。在调试过程中,我已经习惯于像这样传递fsi命令,以使repl窗口中的内容清晰可见:

fsi.AddPrinter(fun (x : myType) -> myType.ToString())
我想将其扩展到使用printf格式化程序,这样我就可以键入

printf "%A" instanceOfMyType 
和控制自定义类型的输出。这本书暗示这是可以做到的(第93页,“通用结构格式可以扩展到任何用户定义的数据类型, 这是F#网站上的一个主题),但我没有找到任何关于如何真正做到这一点的参考资料。有人知道怎么做吗?有可能吗

编辑:

我应该包括一个代码示例,它是我正在处理的记录类型,例如

type myType = 
    {a: int}        
    override m.ToString() = "hello"

let t = {a=5}
printfn "%A" t
printfn "%A" (box t)  
两种打印语句都产生:

{a = 5;}

嗯。。。我隐约记得这方面的一些变化,但我忘了它们是在CTP(1.9.6.2)之前还是之后发生的

无论如何,在CTP上,我看到了

type MyType() =
    override this.ToString() = "hi"
let x = new MyType()
let xs = Array.create 25 x
printfn "%A" x
printfn "%A" xs
当在VFSI窗口中进行计算时,会执行我想要的操作,并且

x;;
xs;;

也打印得很好。因此,我想我不清楚这与期望的有什么不同?

如果您重写ToString方法,应该这样做。

在F#2.0中这样做的正确方法似乎是使用属性,例如:

[<StructuredFormatDisplay("hello {a}")>]
type myType = {a: int}

顺便说一下,如果您调用
printfn“%O”
而不是
printfn“%A”
,则将始终使用
ToString()
(即使对于记录和联合类型),谢谢;请参阅我对原始帖子的编辑,这是一种添加了成员函数的记录类型,其行为与类类型不同…@Brian,是的,应该可以,但正如flatline所说,它不适用于联合和记录类型。不久前我遇到了这个问题:(不记得我在没有得到任何后续信息的情况下是否向fsbugs发送了一些东西,对不起)另请参见,顺便说一句,感谢@Brian在其回答的后续评论中发布了这些链接。我只是觉得其他任何人都值得一试。属性/成员可以是
private
,以避免暴露可能分配对象属性的对象(而不是方法调用)。此外,我无法使用对象方法(“未找到”)。
[<StructuredFormatDisplay("{AsString}")>]
type myType = 
    {a: int}
    override m.ToString() = "hello"
    member m.AsString = m.ToString()  // a property that calls a method