Достижение правильных абстракций с системой типов Хаскелла

У меня проблемы с элегантным использованием системы типов Хаскелла. Я уверен, что моя проблема обычная, но я не знаю, как ее описать, кроме как в терминах, специфичных для моей программы.

Понятия, которые я пытаюсь представить, это:

  • точек данных, каждая из которых принимает одну из нескольких форм, например (id, количество случаев, количество элементов управления), (id, количество случаев, популяция)

  • наборов точек данных и совокупной информации: (id, total cases, total controls), с функциями добавления/удаления точек (таким образом, для каждого сорта точки существует соответствующее разнообразие множества)

Я мог бы иметь класс типов точек и определить каждое разнообразие точек как свой собственный тип. Кроме того, я мог бы иметь один тип точки и другой конструктор данных для каждого сорта. Аналогично для множеств точек.

У меня есть, по крайней мере, один подход к каждому подходу:

  • С классами типов: Предотвращение столкновения имен функций будет раздражать. Например, оба типа точек могут использовать функцию для извлечения "количества случаев", но класс типа не может требовать этой функции, так как некоторые другие типы точек могут не иметь случаев.

  • Без классов типов: Я бы не стал экспортировать конструкторы данных, скажем, из модуля Point (предоставляя другие, более безопасные функции для создания нового значения). Без конструкторов данных я не смогу определить, какое разнообразие имеет данное значение точки.

Какой конструктор может помочь минимизировать эти (и другие) проблемы?

7
задан zoo 26 August 2011 в 20:19
поделиться