[Haskell-beginners] netwire and "dynamic" list of objects

Nathan Hüsken nathan.huesken at posteo.de
Tue Apr 10 17:07:47 CEST 2012


Firstly, thanks for the answer.

Ok, I made another attempt. I have a function, to output the state of
one object:

objectWire :: StdGen -> MyWire () ObjectState

The random generator is used to create the initial state. Now I want to
handle a dynamic set of objects. This is my attempt:

wire :: MyWire () State
wire = proc _ -> do
     rec
       rnds <- Wire.delay initRnds -< (tail rnds)
     let rnd = head rnds        --Get a fresh random generator everytime
     --For now, only one new object every call
     let newObjWires = [objectWire rnd]
     rec
       --Start with newObjWires and add newObjWires everytime (1. Error)
       objWires <- Wire.delay newObjWires -< newObjWires ++ objWires


     oss <- distribute objWires -< () -- 2. Error
     Wire.identity -< GameState rnds ss
     where
       initRnds = stdgens $ mkStdGen 0

Now I get
Not in scope: `newObjWires'
at the 1. Error and
Not in scope: `objWires'
at the 2. Error.

OK, I am guessing that I may not use newObjWires/objWires as parameters
to the functions creating the wires.
But I do not understand how to use any of Control.Wire.Trans.Combine to
handle my dynamic set of wires.

Regards,
Nathan


On 04/10/2012 01:57 PM, Ertugrul Söylemez wrote:
> Nathan Hüsken <nathan.huesken at posteo.de> wrote:
> 
>> I have a simple SDL based graphic demo, which I am trying (for
>> educational purposes) to rewrite utilizing netwire.
>>
>> The demo basically consists of a State which contains a list of object
>> states.
>>
>> [...]
>>
>> But I avoided rewriting "updateState" in wire format. But I have no
>> Idea how to do that.
>> How do I handle a dynamic list of objects in a wire?
> 
> Well, you are not really using FRP here.  You are just forcing this
> application into the FRP model.  Your only behavior is the application
> itself.  This works, but buys you nothing.
> 
> The first step to actually making use of FRP here is to get rid of the
> concept of "updating" something.  Express your game objects themselves
> as wires:
> 
>     player :: GameWire (Input, [Wall]) Player
>     wall   :: GameWire a Wall
>     enemy  :: GameWire (Player, [Wall]) Enemy
> 
> This allows you to write static game worlds.  After that you can move to
> dynamic game worlds using wire transformers from
> Control.Wire.Trans.Combine.  It is also pretty straightforward to write
> your own wire transformers for this purpose.  You probably want to do
> that later -- just look at the source code.
> 
> 
> Greets,
> Ertugrul
> 
> 
> 
> 
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners




More information about the Beginners mailing list