在类型中工作的想法

时间:2012-04-07 06:08:07

标签: ocaml

请参阅My previous question

中的详细信息
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

2 个答案:

答案 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"。使用其他名称(否则你,任何阅读你的代码的人都会非常困惑)