I have a data type Polynomial r for polynomials in Haskell and a Ring instance for it. (The class Ring r where plus :: r -> r -> r ; times :: r -> r -> r ; negative :: r -> r ; zero :: r ; one :: r — it’s just a simplified version of Num).
Now I could define a polynomial such as gauss = x^2 + 1 or eisenstein = x^2 + x + 1 and then work in “Polynomial Integer/(gauss)” for the Gaussian integers or “Polynomial Integer/(eisenstein)” for the Eisenstein integers. That’s the problem, I wrote it in quotes because it’s not a real data type, and I can’t figure out how to define it.
I first tried to do something like data Quotient p = Quot p p and then for example we would have plus (Quot a i) (Quot b i') | i == i' = Quot (plus a b) i Of course this is pretty bad already but it’s not even possible to define one and zero. So I changed it to data Quotient p = Quot p (Maybe p) and I think I have a working implementation using that but you never know for sure if plus will work (it needs at least one Just, and if there are two they must be the same).
Is there any type safe (I mean not using unsafe functions) way to program this in haskell? I am pretty stumped. Thanks!
The implicit configurations paper (cabalized here) uses quotients of Z as an example; it should be straightforward to adapt it to polynomial rings (unless I’m missing something).
Edit: Not saying implicit configurations themselves are straightforward, far from it 😉 – just the modification.