У меня есть 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
Если у вас есть другие проблемы, вы должны задать новые вопросы. – pad