Home > Blockchain >  Generic Pattern in Haskell
Generic Pattern in Haskell

Time:10-11

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)

CodePudding user response:

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.

  • Related