是否有一个函数可以表示任何类型的字符串?

xen*_*a_h 1 ocaml

在过去的一个小时里,我拼命地寻找 OCaml 库中的一种将 'a 转换为字符串的方法:

'a -> string 图书馆里有什么东西我还没找到吗?或者我必须采取不同的做法(我自己写所有内容)?

oct*_*ron 5

在 OCaml 中不可能编写show类型的打印函数'a -> string

事实上,在 OCaml 中编译后类型会被删除。(实际上,它们在类型检查之后被删除,这是编译管道的早期阶段之一)。

因此,类型的函数'a -> _ 可以:

  • 忽略它的论点:
let f _ = "<something>"
Run Code Online (Sandbox Code Playgroud)
  • 查看值的内存表示
let f x = if Obj.is_block x then "<block>" else "<immediate>"
Run Code Online (Sandbox Code Playgroud)

即使查看一个值的内存表示形式也具有有限的效用,因为许多不同的类型将共享相同的内存表示形式。

如果要打印某种类型,则需要为此类型创建打印机。Fmt您可以使用库(或Format标准库中的模块)手动执行此操作

type tree = Leaf of int | Node of { left:tree; right: tree } 
let pp ppf tree = match tree with 
| Leaf d -> Fmt.fp ppf "Leaf %d" d
| Node n -> Fmt.fp ppf "Node { left:%a; right:%a}" pp n.left pp n.right 
Run Code Online (Sandbox Code Playgroud)

或者使用 ppx (OCaml 的一个小型预处理扩展),例如https://github.com/ocaml-ppx/ppx_deriving

type tree = Leaf of int | Node of { left:tree; right: tree } [@@deriving show]
Run Code Online (Sandbox Code Playgroud)