Haskell: Como escrever uma instância `Monoid` para algo que depende de parâmetros

Estou trabalhando em uma pequena biblioteca para a universidade que faz cálculos inteiros em umgrupo cíclico; Coisas como:

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

'Inteiros (% n)' formar claramente um monóide em adição com'0 (% n)' como elemento de identidade. No entanto, adição só faz sentido quando o módulo dos dois operandos adicionados é o mesmo:a (% n) + b (% n) faz sentido, enquantoa (% n) + b (% m) não.

Existe alguma maneira de fazer isso com o sistema de tipos de Haskell? O mesmo, é claro, vale para omempty elemento de identidade: como pode0 (% n) ser construído? poden ser mantido de alguma forma no sistema de tipos?

Ou estruturas como essas requerem o uso de tipos dependentes?

questionAnswers(3)

yourAnswerToTheQuestion