2

请在我的上一个问题中查看详细信息

1) cpf0.ml:
type string = char list
type name = string
type symbol =
| Symbol_name of name

2) problem.ml:

type symbol =
  | Ident of Cpf0.string

在这problem.ml它有两个 type 定义string,当然它给了我一个错误,但是我可以让它们具有相同的类型吗?我需要一个想法。

module Str = struct type t = string end;;
module StrOrd = Ord.Make (Str);;
module StrSet = Set.Make (StrOrd);;
module StrMap = Map.Make (StrOrd);;

module SymbSet = Set.Make (SymbOrd);;
let rec ident_of_symbol = function
  | Ident s -> s

let idents_of_symbols s =
  SymbSet.fold (fun f s -> StrSet.add (ident_of_symbol f) s) s StrSet.empty;;

此表达式的类型为 Cpf0.string = char list,但表达式应为 Util.StrSet.elt = string 类型

4

2 回答 2

2

如果您愿意,您可以在不同模块中为不同类型使用名称“字符串”,尽管(正如 Basile Starynkevitch 指出的那样)它令人困惑。最好选择一个不同的名字。如果确实需要重用名称,可以每次都指定模块。如果您不指定模块,您将获得预定义的含义(或最里面打开的模块的含义)。

在我看来,您引用的代码中的问题是这一行:

module Str = struct type t = string end;;

没有为字符串指定模块名称,因此它引用了预定义的string. 您似乎想说:

module Str = struct type t = Cpf0.string end;;

然而,这很难说。没有足够的上下文让我真正理解你想要做什么。

于 2012-04-07T06:20:56.090 回答
1

string是 Ocaml 中的预定义类型(即在Pervasives模块中);它是例如字符串文字常量的类型,例如"this string". 使用其他名称(否则您和任何阅读您的代码的人都会非常困惑)

于 2012-04-07T06:12:11.787 回答