Определения типов по модулям - PullRequest
2 голосов
/ 02 ноября 2010
module type ELEMENT =
sig
    type element_i
end

module Element:ELEMENT =
struct  
    type element_i =  N of int | CNN of cnn
end

module type SEMIRING =
functor (E:ELEMENT)->
sig
    type elements
end

module Semiring:SEMIRING =
functor(Element:ELEMENT) ->
struct
        let zero = (Element.element_i  0) (*ERROR: Unbounded Value; Same with N 0*)
end

Как я могу создать здесь объекты типа element_i внутри модуля Semiring?

Ответы [ 2 ]

5 голосов
/ 02 ноября 2010

Вы можете позволить программисту создавать значения типа 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

2 голосов
/ 02 ноября 2010

На самом деле в вашем примере две проблемы.На первое указывает Паскаль (то есть конструкторы element_i скрыты подписью).Во-вторых, модуль Element в функторе отличается от модуля Element, который вы объявили выше.Аргумент Element для функтора является «скрывающим» определение Element так же, как параметр функции «скрывает» переменную:

let x = 0

let f = fun x -> (* x here is a different x... *)

module type T = sig (* ... *) end

module M : T = struct (* ... *) end

module F = functor (M : T) -> (* M here is a different M... *)
...