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 <[EMAIL PROTECTED]> 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
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe



_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to