HLearn-algebra-1.0.0: src/HLearn/Algebra/Structures/Modules.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
-- | Modules are a generalization of vector spaces
module HLearn.Algebra.Structures.Modules
where
import Data.List
import HLearn.Algebra.Structures.Groups
-------------------------------------------------------------------------------
-- Modules
class (Num (Ring m)) => HasRing m where
type Ring m
-- | Bug: The module classes have the constraint that r be of type Num. Technically, this should be a Ring. But creating a Ring class would be awkward because it would conflict with the Num class and require importing a different Prelude.
class (HasRing m, Abelian m, Group m) => Module m where
infix 7 .*
(.*) :: (Ring m) -> m -> m
{-# INLINE (*.) #-}
infix 7 *.
(*.) :: m -> (Ring m) -> m
m *. r = r .* m
-------------------------------------------------------------------------------
-- Vector Spaces
class (Module m, Fractional (Ring m)) => VectorSpace m where
infix 7 /.
{-# INLINE (/.) #-}
(/.) :: m -> (Ring m) -> m
m /. r = m *. (1/r)
instance (Module m, Fractional (Ring m)) => VectorSpace m