Вы можете позволить программисту создавать значения типа element_i
внутри Semiring
, не скрывая конструкторы этого типа, как вы это делаете в настоящее время.
Вместо этого определите подпись ELEMENT
как:
module type ELEMENT =
sig
type element_i = N of int | CNN of cnn
end
Это заставляет ваш функтор Semiring
ожидать большего от своего аргумента Element
: вместо любого типа Element.element_i
он теперь принимает тип только с этими конструкторами. Но с положительной стороны теперь он может применять конструкторы для построения значений этого типа, например Element.N 12