2016-08-03 17 views
1
module type FOOable = sig 
    type 'a t 
    val foo : 'a -> 'a t 
end 

module type FOO_FUCNTOR = 
    functor (Elt : FOOable) -> 
    sig 
     type 'a t 
     val foo_alias : 'a -> 'a t 
     (* ... *) 
    end 

は、どのように私はElt.tを使用することはできませんようFOOableで定義された型'a tを参照することができますか?OCamlのファンクタとタイプの問題

したがって、この例では、それはあなたが単に'a Elt.tを入力することができますし、右のタイプを必ず参照してくださいよtype 'a t = 'a list

module MakeFoo : FOO_FUNCTOR = 
    functor (Elt : FOOable) -> 
    struct 
    type 'a t = ??? (* I want the type 'a t belonging to Elt *) 
    let foo_alias = Elt.foo 
    end 

module FooableList = struct 
    type = 'a list 
    let foo x = [x] 
end 

module FooList = MakeFoo(FooableList) 

let a = FooList.foo_alias 2 

答えて

4

なります。

module MakeFoo : FOO_FUNCTOR = 
    functor (Elt : FOOable) -> 
    struct 
    type 'a t = 'a Elt.t 
    let foo_alias = Elt.foo 
    end 

FOO_FUNCTORの定義で、タイプの平等が隠されているように、'a t'a Elt.t間のリンクがMakeFOO定義外に表示されません(しかし、それはあなたが探しているものかもしれない)ということに注意してください。