使用相同名称时键入错误

时间:2012-04-05 10:07:57

标签: ocaml

我有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 = char list  但是表达式需要类型字符串

你可以帮我纠正一下吗?非常感谢你

编辑:谢谢你的回答。我想解释一下这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 = char list        但是表达式的类型为Util.StrSet.elt = string

以下是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 = char list,但表达式的类型为Util.StrSet.elt = string

1 个答案:

答案 0 :(得分:4)

你需要在problem.ml中打开模块Cpf0,因为模块Cfp0和Problem中的类型字符串不一样。

problem.ml:

open Cpf0
type symbol =
  | Ident of string

或更好,不要打开模块并为类型字符串添加前缀,如下所示:

type symbol =
  | Ident of Cpf0.string