<div dir="ltr"><div><div><div><div>Hi guys,<br></div>I have a typeclass like that:<br><br></div><span style="font-family:monospace,monospace">class Signal s where<br></span></div><span style="font-family:monospace,monospace">   type SignalData s :: *</span><br><br><br></div>The idea is that when some signal "s" fires, it returns a data of type (SignalData s).<br><div><div><div><div>This is all fine except when I instantiate the class with:<br><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">data Input a = Input [(a, String)]<br><br></span></div><div><span style="font-family:monospace,monospace">instance Signal (Input a)<br></span></div><div><span style="font-family:monospace,monospace">   type SignalData (Input a) = a</span><br><br><br></div><div>The concrete type of <span style="font-family:monospace,monospace">Input a </span>is not known, so its difficult to store in lists, to serialize...<br></div><div>So I need to create a "view" for the it:<br><br><span style="font-family:monospace,monospace">class (Signal s, Signal v) => SignalView s v where<br></span></div><div><span style="font-family:monospace,monospace">   view :: s -> v</span></div><span style="font-family:monospace,monospace"><br></span><div><span style="font-family:monospace,monospace">data InputView = InputView [(Int, String)]</span><br><br><div><span style="font-family:monospace,monospace">instance Signal InputView<br></span></div><span style="font-family:monospace,monospace">   type SignalData InputView = Int<br></span><br><div><span style="font-family:monospace,monospace">instance SignalView (Input a) InputView<br></span></div><span style="font-family:monospace,monospace">   view (Input as) = InputView (zip [0…] (snd <$> as))<br></span><span style="font-family:arial,helvetica,sans-serif"><br></span></div><div><span style="font-family:arial,helvetica,sans-serif">Is this a common pattern?<br></span></div><div><span style="font-family:arial,helvetica,sans-serif">I'm not sure I get it right...</span><span style="font-family:monospace,monospace"><br></span></div><div><br></div></div></div></div></div>