Hi guys,
I have a typeclass like that:

class Signal s where
   type SignalData s :: *


The idea is that when some signal "s" fires, it returns a data of type (SignalData s).
This is all fine except when I instantiate the class with:

data Input a = Input [(a, String)]

instance Signal (Input a)
   type SignalData (Input a) = a


The concrete type of Input a is not known, so its difficult to store in lists, to serialize...
So I need to create a "view" for the it:

class (Signal s, Signal v) => SignalView s v where
   view :: s -> v

data InputView = InputView [(Int, String)]

instance Signal InputView
   type SignalData InputView = Int

instance SignalView (Input a) InputView
   view (Input as) = InputView (zip [0…] (snd <$> as))

Is this a common pattern?
I'm not sure I get it right...