2010-11-26 127 views
1

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. 
+0

一组S和S.empty有不同的类型。在本案中绕过这个约束的方法是什么? – 2010-11-26 03:44:31

回答

2
type elements = ElementS 

这可能是一个错字:你定义元素是一笔类型与一个恒定的构造ElementS

编译器告诉你这种类型与ElementS.t不兼容。所以你应该写:

type elements = ElementS.t