We have been avoiding this for long, but it seems to grow unavoidable.
The main reason is functions like upDiatonic or ucat, which can simply not be define without knowledge of both aspect-specific types such as Pitch, and the access type classes in Music.Score.
ucat :: (Monoid a, HasParts' a, Music.Score.Part a ~ Part) => [a] -> a
upDiatonic :: (HasPitches' t, Music.Score.Pitch t ~ Pitch) => Pitch -> DiatonicSteps -> t -> t
-- or using the new names
ucat :: (Monoid a, HasParts' a, PartOf a ~ Part) => [a] -> a
upDiatonic :: (HasPitches' t, PitchOf t ~ Pitch) => Pitch -> DiatonicSteps -> t -> t
We have been avoiding this for long, but it seems to grow unavoidable.
The main reason is functions like
upDiatonic
orucat
, which can simply not be define without knowledge of both aspect-specific types such asPitch
, and the access type classes inMusic.Score
.