Search code examples
haskellfunctional-programmingpattern-matchingalgebraic-data-typescustom-data-type

Generic Pattern in Haskell


I was hoping that Haskell's compiler would understand that f v Is type-safe given Unfold v f (Although that is a tall order).

data Sequence a = FirstThen a (Sequence a) | Repeating a | UnFold b (b -> b) (b -> a)

Is there some way that I can encapsulate a Generic pattern for a datatype without adding extra template parameters.

(I am aware of a solution for this specific case using lazy maps but I am after a more general solution)


Solution

  • You can use existential quantification to get there:

    data Sequence a = ... | forall b. UnFold b (b -> b) (b -> a)
    

    I'm not sure this buys you much over the simpler solution of storing the result of unfolding directly, though:

    data Stream a = Cons a (Stream a)
    data Sequence' a = ... | Explicit (Stream a)
    

    In particular, if somebody hands you a Sequence a, you can't pattern match on the b's contained within, even if you think you know what type they are.