在F#的printf
中,有格式说明符%A
,它允许传入任何F#类型,并且它将被评估和打印。为什么Fam的printf中的%A说明符在OCaml的printf中不存在?
举个例子:
type Result<'a> =
| Failure
| Success of 'a
printf "%A" (Success "hello") // prints out 'Success "hello"'
哪里,显然,Result<'a>
不是一个内置类型。
我可以在OCaml的声明类似的类型,但对于Printf.printf
没有等价符 - 相反,我会实现我自己string_of_result
功能,并在格式字符串中使用%s
符。此外,由于这是一个多态类型,我将不得不创建一个不直观的函数,它可以处理任何类型的'a
实例。
我的问题是 - 为什么OCaml缺乏这个方便的说明符?是否因为没有实施它的动机?是否因为有一些缺乏魔咒的魔咒,这只是在F#中?
正如一个补充:这个解决方案需要ppx处理 - 当我将代码复制并粘贴到REPL时,''pp_result'''仍然是未定义的。 –
@ lambda.xy.x - 我也注意到了。出于某种原因,我已经通过'opam'安装了'ppx_deriving',但是现在抛出了一个错误:'找不到deriver show'。 – asafc
是的,我不想让一个真正关于'printf'说明符的答案与构建/配置'ppx_deriving'的细节复杂化。 (参考:在顶层,'#use“topfind”',然后'#require“ppx_deriving.show”',但请参阅'ppx_deriving'文档了解详细信息。) – gsg