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