2012-04-05 2 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.ml: ocamlc -c test.ml. я получил ошибку:

Это выражение имеет тип Cpf0.name = список голец но выражение Ожидалось типа строки

Не могли бы вы помочь мне исправить это? Большое спасибо

EDIT: Благодарим за ваш ответ. Я хочу объяснить больше об этих 3 файлов: Поскольку я работаю с добычей в Coq к типу 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. 

где 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 = string к t = char list, но если я что я должен изменить много функция зависит от (например: set_add_chk выше). Не могли бы вы дать мне хорошую идею? как бы я это сделал.

EDIT 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

ответ

4

Вам нужно открыть модуль Cpf0 в problem.ml, потому что строка типа в модулях Cfp0 и проблема не совпадают.

problem.ml:

open Cpf0 
type symbol = 
    | Ident of string 

или лучше, не открывать модуль и префикс типа строку, как это:

type symbol = 
    | Ident of Cpf0.string 
+4

Я бы добавил, что называние чего-то 'string' может вызвать больше путаницы, чем ясность, которую вы бы получили. – Ashe

+0

Обычно лучше всего не открывать модули; таким образом, у вас будет 'Cpf0.Symbol_name'. – nlucaroni

+0

Да, действительно, я отредактирую свой ответ. – cago

Смежные вопросы