有没有办法在ocaml中打印用户定义的数据类型?

时间:2011-09-22 17:11:56

标签: ocaml

我不能使用print_endline因为它需要一个字符串,而我(我想)我没有办法将我非常简单的用户定义数据类型转换为字符串。如何检查这些数据类型的变量值?

4 个答案:

答案 0 :(得分:13)

在许多情况下,编写自己的string_of_转换例程并不困难。这是一个简单的替代方案,不需要任何额外的库或非标准的OCaml扩展。对于我教授使用OCaml的课程,这通常是学生最简单的机制。

(如果支持对字符串进行泛型转换会很好;也许OCaml派生的东西会流行起来。)

答案 1 :(得分:9)

基本语言中没有任何内容可以帮助您。有一个名为OCaml Deriving的项目(以Haskell的一个特性命名)可以从类型声明中自动派生打印函数。我没有用它,但听起来很棒。

http://code.google.com/p/deriving/

一旦有了打印类型(派生与否)的功能,您可以将其安装在ocaml顶级。这可能很方便,因为内置的顶级打印有时并不能满足您的需求。为此,请使用Chapter 9 of the OCaml Manual中描述的#install-printer指令。

答案 2 :(得分:3)

在OCaml Batteries Included或OCaml Extlib中有第三方库函数,如dump,它们将使用它可以获得的所有运行时信息将任何值一般转换为字符串。但是这将无法恢复所有信息;例如,构造函数名称将丢失并变为整数,因此它看起来并不完全符合您的需要。您基本上必须编写自己的转换函数,或者使用一些可以为您编写它们的工具。

答案 3 :(得分:1)

根据之前的答案,ppx_sexp是一个PPX,用于从类型定义生成打印机。下面是一个如何在使用jbuilder作为构建系统时使用它,并使用Base和Stdio作为stdlib的示例。

首先,jbuild文件指定如何进行构建:

itemUpdatedBy

这是代码。

(jbuild_version 1)

(executables
 ((names (w))
  (libraries (base stdio))
  (preprocess (pps (ppx_jane ppx_driver.runner)))
  ))

当你运行它时,你得到这个输出:

open Base
open Stdio

type t = { a: int; b: float * float }
[@@deriving sexp]

let () =
  let x = { a = 3; b = (4.5,5.6) } in
  [%sexp (x : t)] |> Sexp.to_string_hum |> print_endline

S-expression转换器遍布Base和所有相关库(Stdio,Core_kernel,Core,Async,Incremental等),因此您几乎可以依赖于序列化您在那里遇到的任何数据结构,以及你自己定义的任何东西。