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?