2010-11-02 8 views
2
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 

Comment puis-je créer ici des objets de type element_i dans le module Semiring?Définition des types entre les modules

Répondre

5

Vous pouvez autoriser le programmeur à créer des valeurs de type element_i à l'intérieur de Semiring en ne masquant pas les constructeurs de ce type, comme vous le faites actuellement.

Au lieu de cela, définir la signature ELEMENT comme:

module type ELEMENT = 
sig 
    type element_i = N of int | CNN of cnn 
end 

Cela rend votre foncteur Semiring attend plus de son argument Element: au lieu de tout type Element.element_i, il accepte maintenant seulement un type avec exactement ces constructeurs. Mais sur le plan positif, il peut maintenant appliquer les constructeurs pour construire des valeurs de ce type, par exemple Element.N 12

2

Il y a en fait deux problèmes avec votre exemple. Le premier est souligné par Pascal (c'est-à-dire que les constructeurs de element_i sont cachés par la signature). La seconde est que le module Element dans le foncteur n'est pas le même que le module Element que vous avez déclaré ci-dessus. L'argument Element au foncteur est une « cacher » la définition de Element de la même façon un paramètre de la fonction serait « cacher » une variable:

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... *) 
Questions connexes