2010-11-26 1 views
1

Тип элементов в модуле полукольца - это элемент ElementS, который представляет собой набор элементов. Когда я определяю zero = ElementS.empty, он говорит, что существует тип ошибки как элемент типа <> ElementS.tНесоответствие подписи

Я не мог найти какие-либо подобные вопросы, и havent смог решить эту проблему.

(*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