【问题标题】:OCaml toplevel output formattingOCaml 顶级输出格式
【发布时间】:2010-12-15 19:11:53
【问题描述】:

如果我在 OCaml 的顶层执行以下操作:

#require "num";;
open Ratio;;

ratio_of_int 2;;

输出是:

- : Ratio.ratio = <ratio 2/1>

这样的格式怎么可能? sources 告诉我 Ratio.ratio 是一个记录。所以输出应该更类似于

{numerator = <big_int 2>; denominator = <big_int 1>; normalized = true}

我尝试查看比率输出是否以某种方式在顶层硬编码,但这种搜索没有结果。作为 OCaml 的新手,我必须问我是否遗漏了一些重要的东西?在重载字符串化函数的语言中,这并不奇怪,但在 OCaml 的情况下,我发现这种行为非常不合适。

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    Findlib 有一个专门用于比率模块的漂亮打印机。它不是打印出&lt;abstr&gt;(界面不公开记录),而是打印出您看到的内容。如果您想查看它,请查看 findlib/num_top_printers.ml:

    let ratio_printer fmt v =
      Format.fprintf fmt "<ratio %s>" (Ratio.string_of_ratio v)
    

    【讨论】:

    • 是的,我只是在思考您(现已删除)的问题时发现了这一点。感谢您的帮助!
    • 是的,一开始我很困惑,因为我工作的电脑上没有安装 findlib。我知道这是由于一台漂亮的打印机,但直到我意识到它是 findlib 时才知道这台漂亮的打印机在哪里。
    • 看来使用custom pretty printers in toplevel 很简单。
    • 然而,我认为使用漂亮的打印机只是绕过 OCaml 中令人沮丧的限制,即函数不能重载。
    【解决方案2】:

    顶层有一个指令#install_printer,它接受一个函数来打印任何类型。

    例如,您可以像这样重新定义如何打印整数:

    let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n
    #install_printer print_integer
    

    #install_printer 根据作为参数给出的函数类型选择打印机(此处为Format.formatter -&gt; int -&gt; unit)。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2014-12-23
      相关资源
      最近更新 更多