時,我有3個文件:類型錯誤使用相同的名稱
1)cpf0.ml
type string = char list
type url = string
type var = string
type name = string
type symbol =
| Symbol_name of name
2)problem.ml:
type symbol =
| Ident of string
3)test.ml
open Problem;;
open Cpf0;;
let symbol b = function
| Symbol_name n -> Ident n
當我結合test.ml
:ocamlc -c test.ml
。 我收到一個錯誤:
這個表達鍵入Cpf0.name =字符列表 但預計表達式類型的字符串
能否請你幫我糾正它嗎?非常感謝
編輯:謝謝你的回答。我想解釋一下有關這3個文件的更多: 因爲我一起ocaml的類型提取的勒柯克工作:cpf0.ml
從 cpf.v
產生:
Require Import String.
Definition string := string.
Definition name := string.
Inductive symbol :=
| Symbol_name : name -> symbol.
代碼extraction.v
:
Set Extraction Optimize.
Extraction Language Ocaml.
Require ExtrOcamlBasic ExtrOcamlString.
Extraction Blacklist cpf list.
我開了:open Cpf0;;
在problem.ml
,我又有了一個新問題,因爲在problem.ml
它們對另一類型定義string
此表達式的類型爲Cpf0.string =炭列表 但表達預期類型Util.StrSet.elt =串
這裏是一個定義在util.ml
定義字符串類型:
module Str = struct type t = string end;;
module StrOrd = Ord.Make (Str);;
module StrSet = Set.Make (StrOrd);;
module StrMap = Map.Make (StrOrd);;
let set_add_chk x s =
if StrSet.mem x s then failwith (x^" already declared")
else StrSet.add x s;;
我試圖改變t = string
到t = char list
,但如果我這樣做,我不得不改變很多功能取決於(例如:上面的set_add_chk
)。你能給我一個好主意嗎?在這種情況下我會怎麼做。
編輯2:我很抱歉很多次編輯這個問題。按照答案後,我固定的文件problem.ml
type symbol =
| Ident of Cpf0.string
在problem.ml
他們有這樣的另一種定義。而且類型再次不被接受。
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 =炭列表中,但預期類型Util.StrSet的表達。elt = string
如果您有其他問題,您應該提出新的問題。 – pad 2012-04-06 10:09:45