Hi Hans, Do you have a denotation for your representation (a specification for your implementation)? If so, it will likely guide you to exactly the right type class instances, via the principle of type class morphisms<http://conal.net/papers/type-class-morphisms/>(TCMs). If you don't have a denotation, I wonder how you could decide what correctness means for any aspect of your implementation. Good luck, and let me know if you want some help exploring the TCM process, -- Conal On Tue, Apr 23, 2013 at 6:22 AM, Hans Höglund <hans@hanshoglund.se> wrote:
Hi everyone,
I am experimenting with various implementation styles for classical FRP. My current thoughts are on a continuation-style push implementation, which can be summarized as follows.
newtype EventT m r a = E { runE :: (a -> m r) -> m r -> m r } newtype ReactiveT m r a = R { runR :: (m a -> m r) -> m r } type Event = EventT IO () type Reactive = ReactiveT IO ()
The idea is that events allow subscription of handlers, which are automatically unsubscribed after the continuation has finished, while reactives allow observation of a shared state until the continuation has finished.
I managed to write the following Applicative instance
instance Applicative (ReactiveT m r) where pure a = R $ \k -> k (pure a) R f <*> R a = R $ \k -> f (\f' -> a (\a' -> k $ f' <*> a'))
But I am stuck on finding a suitable Monad instance. I notice the similarity between my types and the ContT monad and have a feeling this similarity could be used to clean up my instance code, but am not sure how to proceed. Does anyone have an idea, or a pointer to suitable literature.
Best regards, Hans
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe