2012-04-05 23 views
1

時,我有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.mlocamlc -c test.ml。 我收到一個錯誤:

這個表達鍵入Cpf0.name =字符列表 但預計表達式類型的字符串

能否請你幫我糾正它嗎?非常感謝

編輯:謝謝你的回答。我想解釋一下有關這3個文件的更多: 因爲我一起ocaml的類型提取的勒柯克工作:cpf0.mlcpf.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. 

其中ExtrOcamlString

我開了: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 = stringt = 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

+2

如果您有其他問題,您應該提出新的問題。 – pad 2012-04-06 10:09:45

回答

4

您需要在problem.ml中打開模塊Cpf0,因爲模塊Cfp0和Problem中的類型字符串不相同。

problem.ml:

open Cpf0 
type symbol = 
    | Ident of string 

或更好,不打開模塊和前綴類型的字符串是這樣的:

type symbol = 
    | Ident of Cpf0.string 
+4

我想補充一點,命名'string'可能會導致比您獲得的清晰度更多的混淆。 – Ashe 2012-04-05 11:10:04

+0

通常情況下,最好不要打開模塊;因此你會有'Cpf0.Symbol_name'。 – nlucaroni 2012-04-05 17:01:52

+0

是的,的確,我會編輯我的答案。 – cago 2012-04-06 07:01:42

相關問題