在 F# 的 printf
中有格式说明符 %A
它允许传入任何 F# 类型,并且将对其进行求值和打印。
举个例子:
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# 中缺少一些底层的魔力吗?
最佳答案
我想说“缺乏幕后魔力”可能就是原因。
在 F# 中,%A
说明符推迟打印到基于反射的打印机 - 它使用运行时类型信息来遍历和打印值。该过程中使用的反射 API 很大程度上是 .NET 特定的东西。虽然很方便,但它也是一种相对昂贵的机制 - 如果您可以使用更具体的机制,则不应将其用作一揽子说明符。
据我所知,OCaml 没有相应的反射功能可以在这里使用。也许还有另一种机制可以让您实现通用打印 - 但我对 OCaml 内部结构还不够熟悉。
关于f# - 为什么 F#'s printf non-existent in OCaml' s printf 中的 %A 说明符是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43397246/