打印 F# 歧视联合
我正在编写一个 F# 程序,它将字符串解析为 AST 类型,这是一个可区分的联合。
当我使用 fsi
(在 Mono + Mac OS X 上)运行我的代码时,AST 会以良好的格式打印出来。但是当我使用 printfn "%s" <| 时ast.ToString() 我得到类似 FSI_0002.Absyn+clazz
的内容。为所有可区分的联合类型编写 ToString
方法将是一项繁重的工作。
如何使值按照 fsi
的方式打印?
I am writing a F# program which parses a string into a AST type which is a discriminated union.
When I use fsi
(on Mono + Mac OS X) to run my code, the AST is printed out in a nice format. But when I use printfn "%s" <| ast.ToString()
I get something like FSI_0002.Absyn+clazz
. Writing a ToString
method for all the discriminated union types would be a big chore.
How do I make the value print the way fsi
does it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您尝试过 printfn "%A" ast 吗?
%A
说明符考虑了StructuredFormatDisplayAttribute
[MSDN](如果存在)。Have you tried
printfn "%A" ast
? The%A
specifier takes into consideration theStructuredFormatDisplayAttribute
[MSDN], if present.要将可区分联合转换为字符串,您应该使用 sprintf "%A" ast 而不是 ast.ToString()。
如果您想要 Enum.GetName< /a>,您可以使用
Microsoft.FSharp.Reflection
命名空间。请参阅 F# 联合成员的 Enum.GetName 等效项是什么?。To convert a discriminated union into a string, you should use
sprintf "%A" ast
instead of ast.ToString().If you want Enum.GetName, you can use
Microsoft.FSharp.Reflection
namespace. See What is the Enum.GetName equivalent for F# union member?.除了丹尼尔的评论之外,这里还有一篇很好的博客文章,解释了如何以您希望的方式对其进行格式化:
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 (web.archive.org)
In addition to Daniel's comment, here is a good blog article explaining how to format it in whatever way you'd wish:
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 (web.archive.org)