[Haskell-cafe] Embedded Functions in Algebraic Data Types?

Michael Feathers mfeathers at mindspring.com
Sun Feb 10 09:32:54 EST 2008


Great. Thanks to everyone!

Michael

Luke Palmer wrote:
> Quite frequently.
>
> Here are a few examples from my own code:
>
> For "functional references" (representing a bidirectional function
> from a data type to a part of itself (for example the first element of
> a pair)).
>
>   
>> data Accessor s a
>>     = Accessor { get :: s -> a
>>                , set :: a -> s -> s
>>                }
>>     
>
> My quantum computation arrow (really in the realm of "concrete, useful
> things", huh? :-)
>
>   
>> data Operator b c
>>     = Op (forall d. QStateVec (b,d) -> IO (QStateVec (c,d)))
>>     | ...
>>     
>
> The ubiquitous FRP Behavior, comprising a current value and a function
> which takes a timestep and returns the next value.
>
>   
>> data Behavior a
>>    = Behavior a (Double -> Behavior a)
>>     
>
> The "suspend" monad, representing a computation which can either
> finish now with a value of type a, or suspends to request a value of
> type v before continuing.
>
>   
>> data Suspend v a
>>     = Return a
>>     | Suspend (v -> Suspend v a)
>>     
>
> It seems that most frequently, functions in ADTs are used when
> implementing monads or arrows, but that doens't need to be the case.
> A lot of times a function is the best way to represent a particular
> part of a data structure :-)
>
> Luke
>
> On Feb 10, 2008 1:34 PM, Michael Feathers <mfeathers at mindspring.com> wrote:
>   
>> On a lark, I loaded this into Hugs this morning, and it didn't complain:
>>
>>
>> data Thing = Thing (Integer -> Integer)
>>
>>
>>
>> But, I've never seen that sort of construct in an example.  Do people
>> ever embed functions in ADTs?
>>
>>
>> Michael
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>     
>
>   



More information about the Haskell-Cafe mailing list