[Haskell-cafe] [Fwd: selectively allow alternatives in a sum type]
olf at aatal-apotheke.de
Tue Aug 30 13:57:27 UTC 2022
Disregard Const' below, Data.Functor.Const as a newtype is always
strict, as is Identity.
That also ensures Foo' Identity is isomorphic to the original Foo.
Apologies for the noise.
-------- Forwarded Message --------
From: Olaf Klinke <olf at aatal-apotheke.de>
To: Haskell Café <haskell-cafe at haskell.org>
Subject: selectively allow alternatives in a sum type
Date: Tue, 30 Aug 2022 15:30:39 +0200
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. My solution would be to
use a strict version of Data.Functor.Const and make the type higher
newtype Const' a b = Const' !a
-- Const' Void b ~ Void
-- Const' () b ~ ()
data Foo' f = LeftFoo' !A | RightFoo' !(f B)
type Foo = Foo' Identity
type LeftFoo = Foo' (Const' Void) -- can not construct a RightFoo'
The advantage over defining LeftFoo as an entirely different type is
that Foo and LeftFoo can share functions operating entirely on the left
More information about the Haskell-Cafe