[Haskell-cafe] Testing Implementation vs Model - Records or Type Classes?

Heinrich Apfelmus apfelmus at quantentunnel.de
Sat Apr 9 15:58:18 CEST 2011


Twan van Laarhoven wrote:
>> For reference, here the full signature of the core combinators:
>>
>> data Event a
>> data Behavior a
>>
>> instance Functor Behavior
>> instance Applicative Behavior
>> instance Functor Event
>> instance Monoid (Event a)
>>
>> filter :: (a -> Bool) -> Event a -> Event a
>> apply :: Behavior (a -> b) -> Event a -> Event b
>> accumB :: a -> Event (a -> a) -> Behavior a
>
> The apply and accumB functions are harder. Is the Behavior 
> implementation for the model really different from the one of the 
> implementation, which seems to be {initial::a, changes::Event a}? If 
> not, you could just generalize that type by making the event type a 
> parameter
> 
>     data GenBehavior e a = GB a (E a)
> 
> If this is not the case,

I have changed the both implementations completely, so this no longer an 
option.

> then instead of MPTCs you could also try type 
> families,
> 
>     class ... => FRP event where
>         data Behavior event
>         apply :: Behavior event (a -> b) -> event a -> event b
>         accumB :: a -> event (a -> a) -> Behavior event a
> 
> I don't know whether this is any better than the MPTC approach, though.

Data type families have the advantage that I don't run into problems 
with ambiguity. The following seems sensible to me:

     class (Functor (Event f), Functor (Behavior f),
            Applicative (Behavior f)) => FRP f where
         apply :: Behavior f (a -> b) -> Event f a -> Event f b
         ...

where  f  is simply a dummy variable to index different FRP implementations.

The problem with this is that I need the  FlexibleContexts  extension to 
do that. There goes Haskell2010 compatibility.


Best regards,
Heinrich Apfelmus

--
http://apfelmus.nfshost.com




More information about the Haskell-Cafe mailing list