Haskell: Как написать экземпляр `Monoid` для чего-то, что зависит от параметров
Я работаю над небольшой библиотекой для университета, которая выполняет целочисленные вычисления вциклическая группа; Вещи как:
(3 (% 11)) + (10 (% 11))
--> (2 (% 11))
'Целые числа (% n)' четко образуют моноид при добавлении с'0 (% n)' как элемент идентичности. Однако сложение имеет смысл только тогда, когда по модулю добавляются два операнда:a (% n) + b (% n)
имеет смысл, в то время какa (% n) + b (% m)
не.
Есть ли способ обеспечить это с помощью системы типов Haskell? То же самое относится и кmempty
элемент личности: как можно0 (% n)
быть построенным? Можноn
быть как-то в системе типов?
Или такие структуры требуют использования зависимых типов?