<div dir="ltr">Hi Martin,<div><br></div><div>Here's a skeleton of one way you could do something like what you describe:</div><div><br></div><div><div>{-# LANGUAGE MultiParamTypeClasses #-}</div><div>module DES where</div><div><br></div><div>-- Typeclasses for sending and receiving events</div><div>class EventSender a e where</div><div>   send :: a -> e</div><div><br></div><div>class EventRecipient a e where</div><div>   receive :: a -> e -> a</div><div><br></div><div>-- Basic types: players and tables. These can be added to.</div><div>data Player = Player String</div><div>data Table = Table Int Player</div><div><br></div><div>-- Types of events: these can be added to.</div><div>data PlayerEvent = PlayerEvent Player</div><div>data OtherTableEvent = OtherTableEvent Table</div><div>data BallsAtRestEvent = BallsAtRestEvent</div><div><br></div><div>-- Players can send player events</div><div>instance EventSender Player PlayerEvent where</div><div>  send p = PlayerEvent p</div><div><br></div><div>-- Players can receive balls at rest events</div><div>instance EventRecipient Player BallsAtRestEvent where</div><div>  receive p _ = p -- TODO</div><div><br></div><div>-- Tables can receive player events</div><div>instance EventRecipient Table PlayerEvent where</div><div>  receive t _ = t -- TODO</div><div><br></div><div>-- Tables can send other table events</div><div>instance EventSender Table OtherTableEvent where</div><div>  send t = OtherTableEvent t</div><div><br></div><div>-- Tables can receive other table events</div><div>instance EventRecipient Table OtherTableEvent where</div><div>  receive t _ = t -- TODO</div><div><br></div><div>-- Now we combine two tables</div><div>data TableSystem = TableSystem (Table, Table)</div><div><br></div><div>-- The combined system only receives player events, and sends no events</div><div>instance EventRecipient TableSystem PlayerEvent where</div><div>  receive ts _ = ts -- TODO</div></div><div><br></div><div>Alex</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, 1 Sep 2015 at 02:50 martin <<a href="mailto:martin.drautzburg@web.de">martin.drautzburg@web.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello all,<br>
<br>
I've been trying hard to come up with an idea how to build a DES from smaller parts. So far, I came to the conclusion,<br>
that somewhere there must be an operation which takes an Event and maybe emits an Event (and appends to a log and<br>
updates some state). Those Events whould come from and go to the "environment" the simulation runs in.<br>
<br>
My mental model is two billiard tables, which are connected through a hole in the cushion and which each have a player.<br>
When I look at one such table, it would have to respond to Events from its player and from the other table and it would<br>
send events to its player ("all balls at rest") and to the other table.<br>
<br>
If I add the other table and the two players then the combined simulation would not emit any events at all and it would<br>
not respond to any events except maybe as START event. It would only depend on its initial state.<br>
<br>
But if I add only the player, but not the other table, it would still send events to the other table and respond to<br>
events from that other table.<br>
<br>
My problem is the type of Events. I could create a type which encompasses all possible events, but that violates the<br>
idea of composablitly. Somehow I would need to be able to take a system which accepts "player events" and "other table<br>
events", compose it with an other table and end up with a system which only accepts "player events" but no more "other<br>
table events" and similarly for the emitted events. And I don't quite know how to do this.<br>
<br>
Hope this makes some sense.<br>
<br>
Any pointers (which go beyond "aivika has a simulation component") would also be much appreciated.<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div>