1

考虑这个非常基本的模块定义:

module type My_test = sig
  type config with sexp
end;;

当我在 utop 提示符下直接输入时,一切正常:

utop # module type My_test = sig
type config with sexp
end;;
module type My_test =
  sig type config val config_of_sexp : Sexp.t -> config val sexp_of_config : config -> Sexp.t end

但是,当我尝试#use使用包含完全相同定义的文件时,Unbound type constructor _no_unused_value_warning_出现错误:

utop # #use "dummy.mli";;
File "dummy.mli", line 2, characters 7-13:
Error: Unbound type constructor _no_unused_value_warning_

(第 2 行是type config with sexp

版本信息:The universal toplevel for OCaml, version 1.7, compiled for OCaml version 4.01.0

更新:

我开始赏金,因为我真的很感兴趣

  • 知道这是否是 OCaml 错误
  • 我的代码的合理解决方法/修复
4

2 回答 2

4

1) ocaml 顶层有两个未记录的选项,名为:-dsource & -dparsetree

2)如果我启用-dsource,然后尝试#use“dummy.mli”。我看到生成的源代码如下所示:

$ ocaml -dsource
# #use "dummy.mli";;

module type My_test =
  sig
    type config  
     val config_of_sexp : (Sexplib.Sexp.t -> config) _no_unused_value_warning_
     val sexp_of_config : (config -> Sexplib.Sexp.t) _no_unused_value_warning_
end;;
File "dummy.mli", line 1, characters 31-37:
Error: Unbound type constructor _no_unused_value_warning_

3)但是,当我直接将类型声明直接输入到顶层时,生成的源没有“_no_unused_value_warning_”

4) 由于存在_no_unused_value_warning_,为这两种情况生成的分析树略有不同。

5)经过一番摸索后,我看到 type_conv 库插入了 `'val name : _no_unused_value_warning_' 作为一种停用警告的技巧——https: //github.com/janestreet/type_conv/blob/master/lib/pa_type_conv.ml - 从第 916 行开始有一条评论解释了这些东西(我还在学习 ocaml,所以我还不了解这些部分的所有内容)

由于 sexplib 使用 type_conv,因此在这种情况下添加了此签名。

6) 但是,这里真正的问题必须是 ocaml 顶层如何处理 #use 指令和直接输入的代码行。

在此文件中:https ://github.com/diml/ocaml-3.12.1-print/blob/master/toplevel/opttoploop.ml -- use_file(在第 316 行)使用 List.iter 循环遍历 Parsetree 列表.toplevel_phrase 并在每个元素上调用 execute_phrase。REPL 循环(在第 427 行)在单个 Parsetree.toplevel_phrase 上调用 execute_phrase

7)我仍然不确定是什么真正导致了解析树的差异 - 但试图弄清楚它很有趣。

如果更了解这些部分的人发布答案,那就太棒了。

于 2014-03-07T01:17:18.603 回答
1

我今天使用 utop 1.17 和 Ocaml 4.02.1 遇到了这个问题。在阅读了 gautamc'e 的优秀答案后,我尝试了这个简单的解决方法: utop # type 'a _no_unused_value_warning_ = 'a;;

这使我能够成功地#use 遇到问题的模块。

于 2014-12-26T20:13:47.337 回答