diff --git a/numhask.cabal b/numhask.cabal
--- a/numhask.cabal
+++ b/numhask.cabal
@@ -3,74 +3,74 @@
 -- see: https://github.com/sol/hpack
 
 name:           numhask
-version:        0.1.3
+version:        0.1.4.0
 synopsis:       A numeric prelude
 description:    A numeric prelude, providing a clean structure for numbers and operations that combine them.
 category:       mathematics
 homepage:       https://github.com/tonyday567/numhask#readme
 bug-reports:    https://github.com/tonyday567/numhask/issues
-license:        BSD3
-license-file:   LICENSE
 author:         Tony Day
 maintainer:     tonyday567@gmail.com
 copyright:      Tony Day
+license:        BSD3
+license-file:   LICENSE
 build-type:     Simple
 cabal-version:  >= 1.10
 
 extra-source-files:
-  readme.md
-  stack.yaml
+    readme.md
+    stack.yaml
 
 source-repository head
   type: git
   location: https://github.com/tonyday567/numhask
 
 library
-  default-language: Haskell2010
-  ghc-options: -Wall
   hs-source-dirs:
-    src
+      src
+  default-extensions: NegativeLiterals NoImplicitPrelude OverloadedStrings UnicodeSyntax
+  ghc-options: -Wall
+  build-depends:
+      QuickCheck >=2.8 && <3
+    , protolude >=0.1 && <0.3
+    , tasty
+    , tasty-quickcheck
+    , base >=4.7 && <4.11
   exposed-modules:
-    NumHask.Prelude
-    NumHask.Examples
-    NumHask.Algebra
-    NumHask.Algebra.Additive
-    NumHask.Algebra.Basis
-    NumHask.Algebra.Distribution
-    NumHask.Algebra.Ring
-    NumHask.Algebra.Field
-    NumHask.Algebra.Integral
-    NumHask.Algebra.Magma
-    NumHask.Algebra.Metric
-    NumHask.Algebra.Module
-    NumHask.Algebra.Multiplicative
-    NumHask.Algebra.Singleton
-    NumHask.Laws
+      NumHask.Prelude
+      NumHask.Examples
+      NumHask.Algebra
+      NumHask.Algebra.Additive
+      NumHask.Algebra.Basis
+      NumHask.Algebra.Distribution
+      NumHask.Algebra.Ring
+      NumHask.Algebra.Field
+      NumHask.Algebra.Integral
+      NumHask.Algebra.Magma
+      NumHask.Algebra.Metric
+      NumHask.Algebra.Module
+      NumHask.Algebra.Multiplicative
+      NumHask.Algebra.Singleton
+      NumHask.Laws
   other-modules:
-    Paths_numhask
-  build-depends:
-    QuickCheck >=2.8 && <3,
-    protolude >=0.1 && <0.3,
-    tasty,
-    tasty-quickcheck,
-    base >=4.7 && <4.11
-  default-extensions: NegativeLiterals NoImplicitPrelude OverloadedStrings UnicodeSyntax
+      Paths_numhask
+  default-language: Haskell2010
 
 test-suite test
-  default-language: Haskell2010
   type: exitcode-stdio-1.0
-  hs-source-dirs:
-    test
   main-is: test.hs
-  build-depends:
-    QuickCheck >=2.8 && <3,
-    protolude >=0.1 && <0.3,
-    tasty,
-    tasty-quickcheck,
-    base >=4.7 && <5,
-    QuickCheck >=2.8 && <3,
-    doctest,
-    numhask,
-    tasty,
-    tasty-quickcheck
+  hs-source-dirs:
+      test
   default-extensions: NegativeLiterals NoImplicitPrelude OverloadedStrings UnicodeSyntax
+  build-depends:
+      QuickCheck >=2.8 && <3
+    , protolude >=0.1 && <0.3
+    , tasty
+    , tasty-quickcheck
+    , base >=4.7 && <5
+    , QuickCheck >=2.8 && <3
+    , doctest
+    , numhask
+    , tasty
+    , tasty-quickcheck
+  default-language: Haskell2010
diff --git a/src/NumHask/Algebra/Ring.hs b/src/NumHask/Algebra/Ring.hs
--- a/src/NumHask/Algebra/Ring.hs
+++ b/src/NumHask/Algebra/Ring.hs
@@ -5,6 +5,8 @@
   ( Semiring
   , Ring
   , CRing
+  , StarSemiring(..)
+  , KleeneAlgebra
   ) where
 
 import Data.Complex (Complex(..))
@@ -75,3 +77,23 @@
 instance CRing Integer
 
 instance (CRing a) => CRing (Complex a)
+
+-- | StarSemiring
+--
+-- > star a = one + a `times` star a
+--
+class (Semiring a) => StarSemiring a where
+    star :: a -> a
+    star a = one + plus' a
+
+    plus' :: a -> a
+    plus' a = a `times` star a
+
+-- | KleeneAlgebra
+--
+-- > a `times` x + x = a ==> star a `times` x + x = x
+-- > x `times` a + x = a ==> x `times` star a + x = x
+--
+class (StarSemiring a, AdditiveIdempotent a) => KleeneAlgebra a
+
+
diff --git a/src/NumHask/Laws.hs b/src/NumHask/Laws.hs
--- a/src/NumHask/Laws.hs
+++ b/src/NumHask/Laws.hs
@@ -38,6 +38,9 @@
   , tensorProductLaws
   , banachLaws
   , hilbertLaws
+  , semiringLaws
+  , ringLaws
+  , starSemiringLaws
   ) where
 
 import NumHask.Prelude
@@ -531,3 +534,24 @@
   [ ( "basis divide: a ./. a ≈ singleton one"
     , Unary (\a -> a == singleton zero || (a ./. a) ≈ singleton one))
   ]
+
+-- | semiring
+semiringLaws :: (Eq a, Semiring a) => [Law a]
+semiringLaws = additiveLaws <> distributionLaws <>
+    [ ( "associative: (a * b) * c = a * (b * c)"
+    , Ternary (\a b c -> (a `times` b) `times` c == a `times` (b `times` c)))
+    , ("left id: one * a = a", Unary (\a -> one `times` a == a))
+    , ("right id: a * one = a", Unary (\a -> a `times` one == a))
+    ]
+
+-- | ring
+ringLaws :: (Eq a, Ring a) => [Law a]
+ringLaws = semiringLaws <> additiveGroupLaws
+
+-- | starsemiring
+starSemiringLaws :: (Eq a, StarSemiring a) => [Law a]
+starSemiringLaws = semiringLaws <>
+    [ ( "star law: star a == one + a `times` star a"
+    , Unary (\a -> star a == one + a `times` star a))
+    ]
+
