[Haskell-cafe] Announcement - HGamer3D - 0.2.1 - why netwire
Heinrich Apfelmus
apfelmus at quantentunnel.de
Sun Mar 24 16:41:07 CET 2013
Ertugrul Söylemez wrote:
> Heinrich Apfelmus <apfelmus at quantentunnel.de> wrote:
>
>> I concur that chaining wires with the andThen combinator is very
>> slick, I like it a lot. Wolfgang Jeltsch recently described a similar
>> pattern for classical FRP, namely a behavior that doesn't live
>> forever, but actually ends at some point in time, which can be
>> interpreted as an event occurrence. ("It ends with a bang!")
>
> Well, that would work, but I wonder why then you wouldn't want to go all
> the way to signal inhibition. You don't need AFRP to have it. It's
> actually quite a light-weight change. Allow behaviors not to produce a
> value, i.e. somewhere in your library replace "a" by "Maybe a".
I think that the andThen combinator is slick, but I'm not sure whether
I find the underlying model -- signal inhibition -- to be equally
pleasing. In the context of GUI programming, chaining several events
with the andThen combinator is almost never needed, so I've postponed
these questions for now.
>> How would you express the TwoCounters example [1] using dynamic event
>> switching in netwire? (The example can be implemented without dynamic
>> event switching, but that's not what I mean.) What about the BarTab
>> example [2]?
>
> I've been asked that via private mail. Let me just quote my answer:
>
> "This is a misconception caused by the very different nature of
> Netwire. In Netwire everything is dynamic. What really happens in
> w1 --> w2 is that at the beginning only w1 exists. When it inhibits
> it is removed from the network and w2 takes its place. The missing
> ingredient is that w2 is not actually produced by a wire, but this
> is equally easy and natural. Just consider the context wires:
>
> context id w
>
> This wire will dynamically create a version of 'w' for every
> different input, so it acts like a router that will create wires if
> they don't already exist. Deletion works similarly:
>
> contextLatest id 1000 w
>
> This is a version that only keeps the 1000 latest contexts.
So context has the same purpose as Conal's trim combinator [1].
However, I believe that it is too inconvenient for managing very dynamic
collections that need to keep track of state, as the context function
significantly limits the scope of the stateful wire. That's why I've
opted for a more flexible approach in Reactive.Banana.Switch , even if
that introduces significant complexity in the type signatures. Again, I
would be interested in an implementation of the BarTab example [2] to
compare the two approaches.
[1]:
http://conal.net/blog/posts/trimming-inputs-in-functional-reactive-programming
[2]: http://www.haskell.org/haskellwiki/Reactive-banana/Examples#bartab
Best regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
More information about the Haskell-Cafe
mailing list