 class MkConstraint a where
 mkConstraint :: a > Constraint
 newtype Constraint = Constraint {
 unConstraint :: Vector (Char, Int)
 bonusTable :: Double > Double > Constraint > PrimArray DIM2 Double
Documentation
class MkConstraint a whereSource
We can create a constraint from different sources
mkConstraint :: a > ConstraintSource
newtype Constraint Source
A constraint is nothing more than a vector of constraint characters together with a possible pairing for each character.
Constraint  

bonusTable :: Double > Double > Constraint > PrimArray DIM2 DoubleSource
Given a Constraint
, create an NxN matrix with bonus energies. These
energies can be included in all paircreating functions and will disallow or
strongly favor certain pairings, while others will receive neither bonus nor
malus.
In case, a pair (i,j) is annotated as both, bonus and malusreceiving, it will be set to receive a malus. This can happen, if something like < would give a bonus, but x gives a malus (and other cases).
TODO and again, we should parametrize over Energy, Score, etc (that is, Prim a)