我已经阅读了很多内容专家 F#并正在致力于构建一个实际的应用程序。在调试时,我已经习惯了传递这样的 fsi 命令,以使 repl 窗口中的内容清晰可见:
fsi.AddPrinter(fun (x : myType) -> myType.ToString())
我想扩展它以与 printf 格式化程序一起使用,这样我就可以输入例如
printf "%A" instanceOfMyType
并控制自定义类型的输出。这本书暗示这是可以做到的(第 93 页,“通用结构格式化可以扩展到任何用户定义的数据类型,
F# 网站上涵盖的主题”),但我没有找到任何关于如何实际实现这一目标的参考资料。有人知道如何实现吗?这可能吗?
Edit:
我应该包含一个代码示例,它是我正在处理的记录类型,例如
type myType =
{a: int}
override m.ToString() = "hello"
let t = {a=5}
printfn "%A" t
printfn "%A" (box t)
两个打印语句都会产生:
{a = 5;}
看起来在 F# 2.0 中执行此操作的正确方法是使用StructuredFormatDisplay http://msdn.microsoft.com/en-us/library/ee370334.aspx属性,例如:
[<StructuredFormatDisplay("hello {a}")>]
type myType = {a: int}
在本例中,不是默认的{a = 42;}
,你会得到hello 42
.
这对于对象、记录和联合类型的工作方式相同。尽管模式必须是以下格式"PreText {PropertyName} PostText"
(PreText and PostText是可选的),这实际上比ToString()
因为:
PropertyName
可以是任何类型的属性。如果它不是字符串,那么它也将受到结构化格式化的影响。唐·赛姆的博客 http://blogs.msdn.com/b/dsyme/archive/2010/01/08/some-tips-and-tricks-for-formatting-data-in-f-interactive-and-a-in-sprintf-printf-fprintf.aspx给出了以这种方式递归格式化树的示例。
-
它可能是一个经过计算的属性。所以你实际上可以得到ToString()
为记录和联合类型工作,尽管是以一种相当迂回的方式:
[<StructuredFormatDisplay("{AsString}")>]
type myType =
{a: int}
override m.ToString() = "hello"
member m.AsString = m.ToString() // a property that calls a method
顺便一提,ToString()
如果您调用,将始终使用(即使对于记录和联合类型)printfn "%O"
代替printfn "%A"
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)