
On Tue, 30 Aug 2022, Olaf Klinke wrote:
Is there prior art/existing packages for the following? Is it maybefunctional programming folklore? Is it a sign of bad program design? Sometimes I feel the need to selectively allow or disallow alternatives in a sum type. That is, suppose we have a sum type
data Foo = LeftFoo !A | RightFoo !B
and at some places in the program we want the type system to enforce that only the constructor LeftFoo can be used.
We could use a type variable and type classes. f :: (ContainsA x) => ... x ... g :: (ContainsA x, ContainsB x) => ... x ... where the classes ContainsA and ContainsB provide accessors to the summands. Then x could be either A or B or Either A B and so on and there would be instances instance ContainsA A instance ContainsB B instance (a ~ A) => ContainsA (Either a b) instance (b ~ B) => ContainsB (Either a b)