noether-0.0.1: library/Noether/Algebra/Multiple/Ring.hs
module Noether.Algebra.Multiple.Ring where
import Noether.Lemmata.TypeFu
import Noether.Algebra.Multiple.Semiring
import Noether.Algebra.Single
type family RingS (add :: ka) (mul :: km) (a :: Type) = (r :: RingE)
data RingE
= Ring_Semiring_Cancellative { ring_semiring :: SemiringE
, ring_addition_cancellative :: CancellativeE}
| Ring_AbelianGroup_Group { ring_additive_group :: AbelianGroupE
, ring_multiplicative_group :: GroupE}
| RingNamed Symbol
RingE
class RingK (add :: ka) (mul :: km) a (s :: RingE)
instance (SemiringK p m a zs, CancellativeK p a zpc) =>
RingK p m a (Ring_Semiring_Cancellative zs zpc)
instance (AbelianGroupK p a zpab, GroupK m a zmg) =>
RingK p m a (Ring_AbelianGroup_Group zpab zmg)
instance (KnownSymbol sym, RingK p m a s) =>
RingK p m a (RingNamed sym s)
type RingC p m a = RingK p m a (RingS p m a)