2010-10-28 4 views
3

Целью модуля, описанного ниже, является реализация модуля, который после инициализации целым n выполняет все операции, основанные на значении n.Проблема реализации фанктора

module ReturnSetZero = 
functor (Elt : int) -> 
    struct 
     let rec sublist b e l = 
       match l with 
      [] -> failwith "sublist" 
      | h :: t -> 
       let tail = if e = 0 then [] else sublist (b - 1) (e - 1) t in 
        if b > 0 then tail else h :: tail 
     let rec zerol = 0:: zerol 
     let zeron = sublist 0 n zerol 
       (*other operations based on n which is selected once when the module is initialized*) 
    end;; 

Ошибка: Освобожденный модуль типа INT

Что такое проблема здесь? Существует ли более эффективная/интуитивная альтернативная реализация?

ответ

2

Функторные карты модули для модулей. Целое число не является модулем, поэтому вы не можете использовать его как параметр функтора.

Вы должны определить тип модуля:

module type WITH_INTEGER = sig 
    val integer : int 
end 

module PrintInteger = 
    functor (Int:WITH_INTEGER) -> struct 

    let print_my_integer() = print_int Int.integer 

конец

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

let my_function integer = 
    let data = complex_precomputations integer in 
    function arg -> do_something_with arg data 

Это позволяет запускать комплекс предварительные вычисления только один раз на целое число (когда вы передаете его функции).

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