Я хочу составить несколько «черт» по нескольким модулям. Функция может потребовать несколько таких «черт» в качестве входных данных, то есть:
type 'a x_t = < get_x : int ; .. > as 'a constraint 'a = < get_b : float ; .. >
val foo : x_t -> float
составление этих трейтов вручную в интерфейсе обременительно и чревато ошибками, но вполне возможно.
Но в идеальном мире я должен иметь возможность использовать имя «черты» вместо того, чтобы вручную составлять все необходимые поля, т.е. писать что-то вроде:
type 'a x_t = < get_x : int ; .. > as 'a constraint 'a <: a_t
К сожалению, синтаксис OCaml этого не позволяет. Это кажется чисто синтаксическим ограничением, поэтому мне интересно, есть ли для этого более глубокая причина?
Другими словами: почему я не могу напрямую написать ограничения подтипа в сигнатурах типов OCaml?
изменить: Чтобы уточнить вариант использования: у меня есть несколько (иногда взаимозависимых) модулей, которые обеспечивают функциональность в некотором общем общем состоянии. Эти модули должны быть компонуемыми и слабо связанными (т. е. им требуется только их часть глобального состояния для удовлетворения их потребностей, и, таким образом, я всегда могу расширить состояние новыми функциями). Для этого состояние инкапсулируется в объект, который предоставляет несколько линз (выше я использовал только геттеры, а не сеттеры). Следовательно, если я предоставляю определения интерфейса для своих модулей, мне нужно описать требуемые линзы в сигнатуре моих функций через ограничения на параметр типа, который кодирует весь тип состояния. Теперь я ищу способ написать эти составные требования к подписи как можно короче и читабельнее.