如何访问传递给OCaml中另一个文件中的函数的记录类型元素?

时间:2018-03-08 09:47:53

标签: ocaml

在我对学习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

2 个答案:

答案 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