Моим лучшим предположением было бы повторное использование кода с помощью методов по умолчанию и ортогональное определение путем отделения реализации класса типа от самого типа.
По сути, когда вы определяете класс типов, вы можете определить реализации по умолчанию для методов.Например, класс Eq
(равенство) в Haskell определяет /=
(не равно) как not (x == y)
, и этот метод будет работать по умолчанию для всей реализации класса типа.Аналогичным образом в другом языке вы можете определить класс типов со всем написанным кодом персистентности (Save
, Load
), за исключением одного или двух методов.Или на языке с хорошими способностями отражения вы можете заранее определить все методы сохранения.На практике это похоже на множественное наследование.
Теперь, другое дело, что вам не нужно прикреплять класс типа к вашему типу в том же месте, где вы определяете свой тип, вы можете сделать это позже и в другом месте.Это позволяет хорошо отделить логику персистентности от исходного типа.
В моей любимой статье всегда есть несколько хороших примеров того, как это выглядит на языке ООП: http://www.stefanwehr.de/publications/Wehr_JavaGI_generalized_interfaces_for_Java.pdf. Их описание реализаций по умолчанию иРеализации ретроактивного интерфейса - это, по сути, те же языковые возможности, которые я только что описал.
Отказ от ответственности: Я действительно не знаю Haskell, поэтому я могу ошибаться в некоторых местах