The ViterbiNBest semiring keeps track of the n best scoring path to a known
output. This score is determined by a user defined WeightedSemiring.
The value of n (the number of of values to rank) is included in the type to prevent
combining mismatching values. To create a new n, make a new unary type and an instance
data Ten = Ten
instance N Ten where
mkN = Ten
n _ = 10