Функторы в отдельных файлах в OCaml?

106
4

Я хочу иметь большой functor Hello (Blah: Blah_type) и сохранить его в файле hello.ml, но как это сделать?


Если бы я был только в своем файле верхнего уровня, я бы   модуль Hello (Blah: Blah_type) =     структура       val x = 2     конец


но как поставить аргумент в hello.ml? Я не могу просто иметь весь файл "val x = 2"...?

спросил(а) 2012-04-11T19:00:00+04:00 8 лет, 6 месяцев назад
1
Решение
91

Это невозможно. Исходные файлы всегда представлены как обычные модули, а не функторы. Это тривиально разрешено с одним дополнительным открытым.

ответил(а) 2012-04-11T19:24:00+04:00 8 лет, 6 месяцев назад
107

OCamlPro имеет патч компилятора и внешний инструмент, который может поддерживать это:


http://www.ocamlpro.com/blog/2011/08/10/ocaml-pack-functors.html

Насколько я знаю, официальный выпуск компилятора не поддерживает файлы .ml как функторы.

ответил(а) 2012-04-11T19:25:00+04:00 8 лет, 6 месяцев назад
81

Чтобы дополнить ygrek ответом с образцом реального кода вместо файла foo.ml с контентом


module type S = sig
(* ... *)
end

module Hello (M : S) = struct
(* ... *)
end

module M : S = struct
(* ... *)
end

module H = Hello(M)

(* ... *)


У вас может быть hello.ml с контентом


module type S = sig
(* ... *)
end

module Make (M : S) = struct
(* ... *)
end


и foo.ml, переписанные как


module M : Hello.S = struct
(* ... *)
end

module H = Hello.Make(M)

(* ... *)


PS: Если вы считаете, что это запутанно, уплотнение модуля M : S или M : Hello.S является необязательным (M будет принудительно применено к этой сигнатуре, когда будет передано функтору), это было просто показать, как это можно сделать.

ответил(а) 2012-04-12T14:18:00+04:00 8 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема