2016-01-13 3 views
4

Я пытаюсь ссылаться на тип в сигнатуре модуля для создания другого типа.ссылка на подпись типа модуля

module type Cipher = sig 

    type local_t 
    type remote_t 

    val local_create : unit -> local_t 
    val local_sign : local_t -> Cstruct.t -> Cstruct.t 
    val remote_create : Cstruct.t -> remote_t 
    val remote_validate : remote_t -> Cstruct.t -> bool 

end 

module Make_cipher :                
    functor (Cipher_impl : Cipher) -> 
    sig                   
     type local_t = Cipher_impl.local_t           
     type remote_t = Cipher_impl.remote_t 
     val local_create : unit -> local_t 
     val local_sign : local_t -> Cstruct.t -> Cstruct.t 
     val remote_create : Cstruct.t -> remote_t 
     val remote_validate : remote_t -> Cstruct.t -> bool 
    end 

type self_t = 
    { 
    mutable modules : (module Cipher) list; 
    mutable locals : Cipher.local_t list; 
    } 

Когда я скомпилирую это, я получаю сообщение «Ошибка: Unbound module Cipher» для self_t. Я не слишком уверен, что делать здесь.

ответ

4

Короче говоря, вы должны использовать Cipher_impl.local_t вместо Cipher.local_t

модуль типа (так называемый подписи) только спецификация интерфейса модуля. Когда вам нужен тип, вам нужно обратиться к определенному типу в определенном модуле, а не в подписи.

+0

Ah - но существует множество реализаций 'Cipher_impl.local_t'. Возможно, мне нужно каким-то образом сделать это полиморфным? – njb

+0

«Cipher_impl» - это параметр функтора, который обозначает множество реализаций. Это как формальный параметр функции, который обозначает множество возможных значений. – ivg

+0

Если я выполняю «изменчивые локали: Cipher_impl.local_t list;», тогда я получаю «Ошибка: Unbound module Cipher_impl» – njb

Смежные вопросы