
Max Bolingbroke schrieb:
Let's start with a simple example of an existential data type:
data Stream a = forall s. Stream s (s -> Maybe (a, s))
I use quite the same data type for my signal processing applications: http://code.haskell.org/synthesizer/core/src/Synthesizer/State/Signal.hs You may be interested in my overview: http://hackage.haskell.org/packages/archive/synthesizer/0.2.0.1/doc/html/Syn...
Now we may wish to define infinite streams using value recursion:
ones :: Stream Int ones = cons 1 ones
For me a Stream is a List without storage, thus in your example you cannot share the content of 'ones'. The internal state type becomes larger and larger for every new element (every element adds a new layer of Maybe, if I'm not mistaken). In cases, where I want this kind of recursion I store the content generated by a Stream in a list or another more efficient stream type or I write special functions for this purpose (e.g., 'repeat' in the case of 'ones').