签名不匹配
问题描述:
semiring模块中元素的类型是ElementS,它是一组元素。当我定义零= ElementS.empty它说,有类型错误作为类型元素<> ElementS.t签名不匹配
我找不到任何类似的问题,并没有能够解决这个问题。
(*semiring.ml*)
module type SEMIRING =
sig
type elements
type poly = elements polynomial
type variable = int
(** Constants **)
val zero : elements (** Identity for + **)
.....
end
module CountingSemiring : SEMIRING =
struct
module Ord : Carrier.Order =
struct
let vector_order= 2
end
module Z = Carrier.Make(Ord)
module ElementS = Set.Make(
struct
let compare = Pervasives.compare
type t = Z
end)
type elements = ElementS
type varmap = elements IntMap.t
type poly = elements polynomial
let zero = ElementS.empty
end
(* carrier.ml *)
module Make (Ord:Order) =
struct
let o = Ord.vector_order
type t = Elementi.t array
let gen i =
if(i < o) then
let arr = Array.make o (Elementi.N 0) in
Array.set arr i (Elementi.N 1)
else
failwith "Out of bound generate"
....
end
ERROR: Signature mismatch SEMIRING vs CountingSemiring Values do not match: val zero : ElementS.t is not included in val zero : elements when they should be the same.
答
type elements = ElementS
这可能是一个错字:你定义元素是一笔类型与一个恒定的构造ElementS
。
编译器告诉你这种类型与ElementS.t
不兼容。所以你应该写:
type elements = ElementS.t
一组S和S.empty有不同的类型。在本案中绕过这个约束的方法是什么? – 2010-11-26 03:44:31