data-tensor- Tensor and Group typeclasses

Safe HaskellSafe



Typeclasses for Group and Tensor, extending Monoid.



class Monoid a => Group a where Source

A group is a monoid with an invert operation. Intuition: >< is to <> what subtraction is to addition; invert turns a value into its complement (see Laws below), and corresponds with unary minus in addition.


a >< b == a <> (invert b)
a >< mempty == a
a >< a == mempty
a <> (invert a) == mempty
invert mempty == mempty

Minimal complete definition



(><) :: a -> a -> a infixl 6 Source

Dual to <>.

invert :: a -> a Source

"Negation": convert an operand into its dual.


Num a => Group (Sum a) Source 

class Group b => Tensor a b where Source

Tensor allows us to define a relationship between two types, the second one forming a Group. The intuition is that the first type models something like a "location", and the second (the group) models the relative distance between two locations. Examples of Tensors include date/time values (point in time) and timespans; positions in a vector space and displacement vectors; pitches and intervals in music.

Tensor provides three operations: ?<> ("tensor addition"), adding a "distance" to a "location"; ?>< ("tensor subtraction"), undoing the effect of adding a "distance" to a "location", and >?<, getting the "distance" between two "locations".


a ?<> (b >?< a) == b
a ?<> (x <> y) == a ?<> x ?<> y
a ?>< b == a ?<> (invert b)
a ?<> (x >< y) == a ?<> x ?>< y

Minimal complete definition

(?<>), (>?<)


(?<>) :: a -> b -> a infixl 6 Source

(?><) :: a -> b -> a infixl 6 Source

(>?<) :: a -> a -> b infixl 6 Source


Group a => Tensor a a Source

All groups trivially form tensors with themselves