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 の2つの定義が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 のモジュール名を指定しないため、事前定義されstringた . 次のように言いたかった可能性があります。

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

ただし、わかりにくいです。あなたがやろうとしていることを本当に理解するのに十分なコンテキストがありません。

于 2012-04-07T06:20:56.090 に答える
1

stringOcaml (つまり、Pervasivesモジュール) で定義済みの型です。たとえば、 のような文字列リテラル定数の型です"this string"。他の名前を使用してください(そうしないと、あなたとあなたのコードを読んでいる人が非常に混乱するでしょう)

于 2012-04-07T06:12:11.787 に答える