Исходя из фона ООП, система типа Haskell и способ взаимодействия конструкторов данных и типов моделей трудно осмыслить. Я могу понять, как каждый из них используется для простых примеров, но некоторые более сложные примеры структур данных, которые очень хорошо подходят для стиля ООП, доказывают, что нетривиальные преобразования в аналогичные элегантные и понятные типы.
В частности, у меня возникла проблема с организацией иерархии данных, например следующих.
Это глубоко вложенная иерархическая структура наследования, и отсутствие поддержки для подтипирования не дает понять, как превратить эту структуру в альтернативу естественного ощущения в Haskell. Возможно, будет нормально заменить что-то вроде Polygon
на тип данных суммы, объявив его как
data Polygon
= Quad Point Point
| Triangle Point Point Point
| RegularNGon Int Radius
| ...
Но это теряет часть структуры и может быть действительно удовлетворительно выполнено только для одного уровня иерархии. Typeclasses можно использовать для реализации формы наследования и подструктуры в том, что класс Polygon
может быть подклассом Shape
, и, возможно, все экземпляры Polygon
имеют реализации для centroid :: Point
, а также vertices :: [Point]
, но это кажется неудовлетворительным. Что было бы хорошим способом захвата структуры картины в Haskell?