Я начал читать этот документ по CRDT, который является способом совместного использования модифицируемых данных, гарантируя, что операции, которые изменяют данные, являются коммутативными, Мне показалось, что это будет хороший кандидат на абстракцию в Haskell - предоставить класс для CRDT, который задает тип данных и операции, которые коммутируют в этом типе, а затем работать над тем, чтобы библиотека фактически делила обновления между параллельными процессами.
То, что я не могу понять, заключается в том, как заключить контракт, что операции должны коммутироваться в спецификации класса.
Для простого примера:
class Direction a where
turnLeft :: a -> a
turnRight :: a -> a
Нет гарантии, что turnLeft . turnRight
совпадает с turnRight . turnLeft
. Я предполагаю, что резерв должен указать эквивалент законов монады - использовать комментарий для указания ограничений, которые не применяются системой типов.