我已经阅读了很多专家F#,正在构建一个实际的应用程序.在调试时,我已经习惯于传递这样的fsi命令,以使repl窗口中的内容清晰可见:
fsi.AddPrinter(fun (x : myType) -> myType.ToString())
Run Code Online (Sandbox Code Playgroud)
我想扩展它以使用printf格式化程序,所以我可以输入例如
printf "%A" instanceOfMyType
Run Code Online (Sandbox Code Playgroud)
并控制自定义类型的输出.本书暗示可以做到这一点(第93页,"可以扩展通用结构格式以适用于任何用户定义的数据类型,F#网站上涵盖的主题"),但我没有找到任何关于如何实际上实现这一点.有谁知道怎么样?它甚至可能吗?
编辑:
我应该包含一个代码示例,它是我正在处理的记录类型,例如
type myType =
{a: int}
override m.ToString() = "hello"
let t = {a=5}
printfn "%A" t
printfn "%A" (box t)
Run Code Online (Sandbox Code Playgroud)
两个印刷语句产生:
{a = 5;}
Run Code Online (Sandbox Code Playgroud) 如果使用F#Interactive Shell(FSI),则推断的表达式类型(签名)将与其值一起打印到控制台:
val it : int * string * float = (42, "Hello F#", 42.0)
Run Code Online (Sandbox Code Playgroud)
如何在我自己的代码中模仿相同的行为,例如将推断的类型作为F#表达式的字符串?
我不需要动态评估任何F#表达式,这些表达式在编译时是已知的,并且是我的(静态)F#代码的一部分.我需要这个功能才能在我的F#演示中模仿LINQPad中的FSI输出.