Чтобы немного расширить ответ sclv, существует расширенное семейство тесно связанных концепций, которые сводятся к предоставлению некоторых средств деконструкции значения: катаморфизмы, которые представляют собой обобщенные складки;Церковное кодирование, которое представляет данные своими операциями и часто эквивалентно частичному применению катаморфизма к значению, которое оно разрушает;Преобразования CPS, где кодировка Черча напоминает сопоставленное сопоставление с шаблоном, которое принимает отдельные продолжения для каждого случая;представление данных в виде набора операций, которые их используют, обычно называемые объектно-ориентированным программированием;и т. д.
В вашем случае вам нужен абстрактный тип , то есть тот, который не экспортирует свое внутреннее представление, но не полностью запечатанный, т.е.что оставляет представление открытым для функций в модуле, который его определяет.По той же схеме следуют такие вещи, как Data.Map.Map
.Вы, вероятно, не хотите идти по пути класса типов, поскольку, похоже, вам нужно работать с различными точками данных, а не с произвольным выбором точки данных одного типа.
Скорее всего, лучшая отправная точка - некоторая комбинация «умных конструкторов» для создания значений и разнообразные функции деконструкции (как описано выше), экспортированные из модуля.Исходя из этого, я ожидаю, что у большинства оставшихся деталей должен быть очевидный подход, который следует использовать дальше.