<html><head></head><body bgcolor="#FFFFFF"><div>Actually, using cast seems to be a perfect solution here. I can't see anything wrong with it.<br><br>Отправлено с iPad</div><div><br>03.07.2012, в 20:33, Corentin Dupont &lt;<a href="mailto:corentin.dupont@gmail.com">corentin.dupont@gmail.com</a>&gt; написал(а):<br><br></div><div></div><blockquote type="cite"><div>Hi all,<br>I read somewhere (here: <a href="http://stackoverflow.com/questions/2300275/how-to-unpack-a-haskell-existential-type">http://stackoverflow.com/questions/2300275/how-to-unpack-a-haskell-existential-type</a>) that it's bad to try to unbox an existential type using a cast. OK, but without I really can't figure out how to do what I want:<br>
<br><i>data NewPlayer = NewPlayer deriving (Typeable, Eq)<br>data NewRule = NewRule deriving (Typeable, Eq)<br><br>class (Eq e, Typeable e) =&gt; Event e where<br>&nbsp;&nbsp;&nbsp; data EventData e<br><br>instance Event NewPlayer where<br>
&nbsp;&nbsp;&nbsp; data EventData NewPlayer = P Int<br><br>instance Event NewRule where<br>&nbsp;&nbsp;&nbsp; data EventData NewRule = R Int<br><br>instance Typeable1 EventData where <br>&nbsp;&nbsp;&nbsp; typeOf1 _ = mkTyConApp (mkTyCon "EventData") []<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>triggerEvent :: (Event e) =&gt; e -&gt; (EventData e) -&gt; [EventHandler] -&gt; IO ()<br>triggerEvent e d ehs = do<br>&nbsp;&nbsp;&nbsp; let r = find (\(EH myEvent _) -&gt; cast e == Just myEvent) ehs<br>&nbsp;&nbsp;&nbsp; case r of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nothing -&gt; return ()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Just (EH _ h) -&gt; case cast h of<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Just castedH -&gt; castedH d<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Nothing -&gt; return ()</i><br><br>How to remove the casts from triggerEvent? All that I want is to apply the handler found on the data passed in parameter.<br>
I tried to add a function apply in the class, without success:<br><i>apply :: (EventData e -&gt; IO ()) -&gt; (EventData e) -&gt; IO ()<br>apply = ($)</i><br><br><br>Thanks!<br>Corentin<br>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Haskell-Cafe mailing list</span><br><span><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a></span><br><span><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a></span><br></div></blockquote></body></html>