Haskell: Как написать экземпляр `Monoid` для чего-то, что зависит от параметров

Я работаю над небольшой библиотекой для университета, которая выполняет целочисленные вычисления вциклическая группа; Вещи как:

(3 (% 11)) + (10 (% 11))
--> (2 (% 11))

'Целые числа (% n)' четко образуют моноид при добавлении с'0 (% n)' как элемент идентичности. Однако сложение имеет смысл только тогда, когда по модулю добавляются два операнда:a (% n) + b (% n) имеет смысл, в то время какa (% n) + b (% m) не.

Есть ли способ обеспечить это с помощью системы типов Haskell? То же самое относится и кmempty элемент личности: как можно0 (% n) быть построенным? Можноn быть как-то в системе типов?

Или такие структуры требуют использования зависимых типов?

Ответы на вопрос(3)

Ваш ответ на вопрос