Как я могу указать, что две операции коммутируют в классе типов?

Я начал читать эту статью о CRDT , который является способом совместного использования изменяемых данных одновременно, гарантируя, что операции, которые изменяют данные, являются коммутативными. Мне показалось, что это будет хорошим кандидатом для абстракции в Haskell - предоставить класс типов для CRDT, который определяет тип данных и операции, которые коммутируют с этим типом, а затем работать над созданием библиотеки для фактического обмена обновлениями между параллельными процессами.

Я не могу понять, как сформулировать контракт, который операции должны коммутировать в спецификации класса типов.

Для простого примера:

class Direction a where
  turnLeft :: a -> a
  turnRight :: a -> a

Нет гарантии, что turnLeft. turnRight совпадает с turnRight. TurnLeft . Я полагаю, что запасным вариантом является указание эквивалента законов монад - используйте комментарий, чтобы указать ограничения, которые не применяются системой типов.

10
задан rampion 23 December 2010 в 19:53
поделиться