Нет, это невозможно.Ваш тип модуля C
будет рекурсивным, что недопустимо.Такая форма рекурсии может очень легко привести к неразрешимой проверке типов, учитывая выразительную силу типов модулей.
Кажется, что вы пытаетесь вставить объектно-ориентированный шаблон в модули, которые обычно не работают- Модули ML очень функциональны по своей природе.Что не так со следующим?
module A2 = Fn(Fn(Fn(Fn(Fn(A, B), B), B), B), B)
Если вы заинтересованы в сокращении общего паттерна, вы можете реализовать комбинатор модулей (в простом Ocaml, поскольку я недостаточно хорошо знаю синтаксис Reason):
module type FN = functor (X:A)(Y:B) -> A
let rec fn n =
if n = 0 then (module (functor (X:A)(Y:B) -> X) : FN)
else (module (functor (X:A)(Y:B) -> (val fn (n-1))(X)(Y)))
module A2 = (val fn 5)(AMod)(BMod)
Вы также можете написать комбинаторы, которые берут список различных B
модулей, хотя мне интересно, насколько это полезно на практике.