[Haskell-cafe] Is this a correct explanation of FRP?

Michael Snoyman michael at snoyman.com
Sun Apr 1 10:40:26 CEST 2012


On Sat, Mar 31, 2012 at 7:15 PM, Peter Minten <peter.minten at orange.nl> wrote:
> On Fri, 2012-03-30 at 09:15 +0300, Michael Snoyman wrote:
>
>> First you state that we shouldn't use `union` for the `ePitch` Event,
>> and then you used it for `bOctave`. Would it be more efficient to
>> implement bOctave as someting like:
>>
>>     eOctave :: Event t (Int -> Int)
>>     eOctave =
>>         filterJust toStep <$> eKey
>>       where
>>         toStep '+' = Just (+ 1)
>>         toStep '-' = Just (subtract 1)
>>         toStep _ = Nothing
>>
>>     bOctave :: Behavior t Octave
>>     bOctave = accumB 0 eOctave
>
> Yes. Though it's slightly less bad, the case with ePitch was something
> like 6 appends. It was mostly a case of badly copying the style from the
> examples and not realizing the examples use event streams from different
> outside sources. I've adapted the example to use something similar to
> your eOctave.
>
>> Also, I'm left wondering: how would you create a new event stream in
>> the first place? You're telling us to just rely on `eKey`, which is
>> fair, but a great follow-up would demonstrate building it. Looking
>> through the docs I found `newEvent`, but I'm not quite certain how I
>> would combine it all together.
>
> The updated document, which now lives at
> http://www.haskell.org/haskellwiki/FRP_explanation_using_reactive-banana
> contains a "Making the example runnable" section which shows how connect
> the example with the outside world.
>
> The short version, regarding the creation of new events, is that you
> have to do it in two parts. You need newAddHandler in the IO monad to
> get a (a -> IO ()) function that fires the event as well as something
> called an AddHandler and fromAddHandler in the NetworkDescription monad
> to get an event from that AddHandler. It's not possible to get values
> out of the NetworkDescription monad (without IORef tricks) and events
> can only be created within a NetworkDescription monad.
>
> The newEvent function looks like what you'd want, but because you can't
> get the event firing function out of NetworkDescription its use is
> limited.
>
> Greetings,
>
> Peter Minten
>

This looks great, thanks.

Michael



More information about the Haskell-Cafe mailing list