f# - 为什么 F#'s printf non-existent in OCaml' s printf 中的 %A 说明符是?

标签 f# ocaml

在 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/

相关文章:

javascript - 如何使用 `ArrayBuffer` 从 `bytes` 生成 `js_of_ocaml`

haskell - 使用 FFI 从 OCaml 调用 haskell 代码

api - 如何在 F# 中隐藏方法?

F#代码组织: types & modules

syntax-error - OCaml : and keyword syntax error

haskell - 需要帮助重写在 OCaml(或任何 ML)中按字谜词对单词进行分组的 Haskell 程序吗?

ocaml - 使用 ocamlbuild 时生成 Menhir 的转储/解释文件

f# - 如何将从数据库返回的日期与日期(字符串或其他)进行比较?

c# - 禁用搜索 GAC

f# - 如何在 Foq 中设置返回 async<T> 的模拟?