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
中,它有两个类型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
答案 0 :(得分:2)
您可以使用名称" string"对于不同模块中的不同类型,如果你喜欢,(正如Basile Starynkevitch指出的那样)令人困惑。选择一个不同的名字会更好。如果确实需要重用该名称,则可以每次都指定该模块。如果您没有指定模块,您将获得预定义的含义(或来自最里面打开的模块的含义)。
在我看来,引用代码中的问题是这一行:
module Str = struct type t = string end;;
不指定字符串的模块名称,因此它引用预定义的string
。你似乎想说:
module Str = struct type t = Cpf0.string end;;
但是,很难说。对我来说,没有足够的背景来真正理解你想要做的事情。
答案 1 :(得分:1)
string
是Ocaml中的预定义类型(即Pervasives
模块中);它是例如字符串文字常量的类型,如"this string"
。使用其他名称(否则你,任何阅读你的代码的人都会非常困惑)