OK, so here&#39;s my last attempt. What do you think?<br>The Event class is optional (it works without because of EventData is enforcing the use of the right types) however, I find it more clear because it clearly specifies which types are events.<br>
<i><br>data NewPlayer = NewPlayer deriving (Typeable, Eq)<br>data NewRule = NewRule deriving (Typeable, Eq)<br><br>class (Eq e, Typeable e) =&gt; Event e<br>instance Event NewPlayer<br>instance Event NewRule<br><br>data family EventData e<br>
data instance EventData NewPlayer = P Int<br>data instance EventData NewRule = R Int<br>instance Typeable1 EventData where <br>    typeOf1 _ = mkTyConApp (mkTyCon &quot;EventData&quot;) []<br><br>data EventHandler = forall e . (Event e) =&gt; EH e (EventData e -&gt; IO ())<br>
<br>addEvent :: (Event e) =&gt; e -&gt; (EventData e -&gt; IO ()) -&gt; [EventHandler] -&gt; [EventHandler] <br>addEvent e h ehs = (EH e h):ehs<br><br><br>triggerEvent :: (Event e) =&gt; e -&gt; (EventData e) -&gt; [EventHandler] -&gt; IO ()<br>
triggerEvent e d ehs = do<br>    let r = find (\(EH myEvent _) -&gt; cast e == Just myEvent) ehs<br>    case r of<br>       Nothing -&gt; return ()<br>       Just (EH _ h) -&gt; case cast h of<br>        Just castedH -&gt; castedH d<br>
        Nothing -&gt; return ()<br><br>-- TESTS<br>h1 :: EventData NewPlayer -&gt; IO ()<br>h1 (P a) = putStrLn $ &quot;Welcome Player &quot; ++ (show a) ++ &quot;!&quot;<br>h2 :: EventData NewRule -&gt; IO ()<br>h2 (R a) = putStrLn $ &quot;New Rule &quot; ++ (show a)<br>
eventList1 = addEvent NewPlayer h1 []<br>eventList2 = addEvent NewRule h2 eventList1<br><br>trigger1 = triggerEvent NewPlayer (P 1) eventList2 --Yelds &quot;Welcome Player 1!&quot; <br>trigger2 = triggerEvent NewRule (R 2) eventList2 --Yelds &quot;New Rule 2&quot; </i><br>
<br><br>Thanks again!!<br>Corentin<br><br><div class="gmail_quote">On Sun, Jun 17, 2012 at 12:46 AM, Alexander Solla <span dir="ltr">&lt;<a href="mailto:alex.solla@gmail.com" target="_blank">alex.solla@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><br><div class="gmail_quote"><div class="im">On Sat, Jun 16, 2012 at 3:31 PM, Corentin Dupont <span dir="ltr">&lt;<a href="mailto:corentin.dupont@gmail.com" target="_blank">corentin.dupont@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Alexander,<br>sorry my initial example was maybe misleading. What I really what to do is to associate each event with an arbitrary data type. For example, consider the following events:<br>NewPlayer<br>NewRule<br>Message<br>


User<br><br>I want to associate the following data types with each, to pass to there respective handlers:<br>NewPlayer ---&gt; Player<br>
NewRule ---&gt; Rule<br>
Message ---&gt; String<br>
User ---&gt; String<br><br>Message and User have the same data type associated, that&#39;s why we can&#39;t use this type as a key to index the event...<div><div><br></div></div></blockquote><div>
<br></div></div><div>In that case, you definitely want FunctionalDependencies or TypeFamilies, and will probably want to drop the constraint (Handler e d) on Event e (if it doesn&#39;t work), and maybe enforce it with explicit exports.</div>

</div>
</blockquote></div><br>