Проблема реализации функтора - PullRequest
3 голосов
/ 28 октября 2010

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

В чем здесь проблема?Есть ли альтернативная реализация, которая является более эффективной / интуитивно понятной?

1 Ответ

2 голосов
/ 28 октября 2010

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

Вам необходимо определить тип модуля:

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

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

...