在我对学习OCaml
的探索中,我不了解如何访问存储在传递给另一个文件中的函数的记录类型中的值。
我的当前代码:
main.ml
档案
(* Declaring a token record type*)
type 'a tokens = {
error_tok : 'a;
id_tok : 'a;
}
let main_fun () =
let token = {
error_tok = -1;
id_tok = 0;
} in
let tok = Rdp.rdp token in
print_int tok;
;;
main_fun ();
rdp.ml
档案
let rdp token = print_string "In RDP function: \n";
print_int token.error_tok;
0;
我正在使用ocamlbuild main.native
进行编译并获得Unbound record field error_tok
的编译错误。如何在token.error_tok
文件中访问存储在rdp.ml
的传入记录类型中的值。
本质上,我试图将记录类型视为enum
。
答案 0 :(得分:5)
首先,在两个模块之间存在依赖循环(主要取决于rpp函数的Rdp,Rdp取决于类型的Main)。一个简单的解决方案是将token
类型移至Rdp
。这会将类型错误移动到您编译main.ml时,因为在声明token
时它不知道字段。
然后,有三种方法可以将记录类型(和字段)放在范围内:
let main_fun () =
let open Rdp in
let token = {
error_tok = -1;
id_tok = 0;
}
in
(* ... *)
let main_fun () =
let token = {
Rdp.error_tok = -1;
id_tok = 0;
}
in
(* ... *)
let main_fun () =
let token : int Rdp.t = { (* or just : _ Rdp.t *)
error_tok = -1;
id_tok = 0;
}
in
(* ... *)
答案 1 :(得分:1)
实际问题已经得到解答。
本质上,我试图将记录类型视为
enum
。
这似乎不太顺利。与C相比,记录类型更类似于struct
。对于enum
,我建议使用常量构造函数的变体,如:
type token =
| Error_tok
| Id_tok
这不会为token
的不同值分配整数值(至少不可见)。但通常这就足够了。您可以测试值的相等性。并且您可以使用模式匹配来执行等效的switch
。您还可以将值与<
进行比较,但要注意实际的顺序是未指定的(尽管显然它似乎是您假设的顺序,即Error_tok < Id_tok
)。如果仍需要分配整数值,则可以使用函数
let token_value = function
| Error_tok -> -1
| Id_tok -> 0