[Haskell-cafe] Unambiguous choice implementation
Bartosz Milewski
bartosz at fpcomplete.com
Tue Jun 26 23:50:38 CEST 2012
I see. So you're current implementation is not push, is it? The original
pull implementation in Fran also used Maybe events, but that was considered
inefficient. How is Reactive Banana better then Fran then?
--Bartosz
On Tue, Jun 26, 2012 at 1:40 AM, Heinrich Apfelmus <
apfelmus at quantentunnel.de> wrote:
> Bartosz Milewski wrote:
>
>> Thanks, Heinrich. I looked at the examples and at the references you
>> provided. I understand the semantic model, so I guess I'm mostly trying to
>> understand the implementation.
>>
>
> Ok. As I mentioned, if you just want to use the library there is no need
> to understand the implementation.
>
>
> Conal's paper was mostly about refining data
>> structures in order to provide better implementation. It's all beautiful
>> up
>> to the point where he introduces the unamb hack. How did you manage to
>> work
>> around this problem and implement event merging efficiently?
>>
>
> Essentially, Conal implements events as
>
> type Event a = [(Time,a)]
>
> The trouble is that when merging events, this representation forces you to
> wait for both events. In other words, the pattern match
>
> union ((t1,x1):e1) ((t2,x2):e2) = ...
>
> needs to know the times of occurrences of both events before it can return
> the earlier one. The trouble is that the merge function should have
> returned the earlier one right away, before knowing exactly when the later
> one happens. The purpose of the unamb hack is circumvent that problem.
>
>
> Reactive-banana's very simple solution to this problem is to represent
> events as
>
> type Event a = [(Time, Maybe a)]
>
> and impose the additional invariant that all events in your program are
> "synchronized", in the sense that they indicate their occurrences at the
> same times^1. If they don't occur at that time, they use Nothing . Then,
> you can implement merge simply as
>
> union ((t1,x1):e1) ((t2,x2):e2) = -- we always have t1 = t2
> (t1, combine x1 x2) : union e1 e2
> where
> combine (Just x) Nothing = Just x -- only left occurs
> combine Nothing (Just y) = Just y -- only right occurs
> combine (Just x) (Just y) = Just x -- simultaneous occurrence
> combine Nothing Nothing = Nothing -- neither occurs
>
> Since the times are given globally, we can also remove them and obtain
>
> type Event a = [Maybe a]
>
> This is how Reactive.Banana.Model does it.
>
>
> Of course, keeping track of a lot of Nothing is something that can be
> optimized. The optimization to apply here is to transform the
> implementation into a push-driven style. I haven't published the details
> yet, but some design notes can be found here.
>
> http://apfelmus.nfshost.com/**blog/2011/04/24-frp-push-**
> driven-sharing.html<http://apfelmus.nfshost.com/blog/2011/04/24-frp-push-driven-sharing.html>
>
>
> ^1: Note that the times do not need to follow a uniform time step.
>
>
>
> Best regards,
> Heinrich Apfelmus
>
> --
> http://apfelmus.nfshost.com
>
>
> ______________________________**_________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/**mailman/listinfo/haskell-cafe<http://www.haskell.org/mailman/listinfo/haskell-cafe>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Haskell-cafe" group.
> To post to this group, send email to haskell-cafe at googlegroups.com.
> To unsubscribe from this group, send email to haskell-cafe+unsubscribe@**
> googlegroups.com <haskell-cafe%2Bunsubscribe at googlegroups.com>.
> For more options, visit this group at http://groups.google.com/**
> group/haskell-cafe?hl=en<http://groups.google.com/group/haskell-cafe?hl=en>
> .
>
>
--
[:Bartosz:]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120626/a092df52/attachment.htm>
More information about the Haskell-Cafe
mailing list