[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