
I made a TH function earlier this year to produce types for constructors:
data Foo = LeftFoo !Int | RightFoo !Char
deriving Show
$(constructorType 'LeftFoo)
deriving instance Show LeftFooC
In a repl you can see it generates a type with a single constructor, an
introducer, and an eliminator.
*Main> :browse
type Foo :: *
data Foo = LeftFoo !Int | RightFoo !Char
type LeftFooC :: *
data LeftFooC = LeftFooC Int
introLeftFooC :: Foo -> Maybe LeftFooC
elimLeftFooC :: LeftFooC -> Foo
*Main> introLeftFooC (RightFoo 'a')
Nothing
*Main> introLeftFooC (LeftFoo 123)
Just (LeftFooC 123)
*Main> elimLeftFooC $ LeftFooC 456
LeftFoo 456
If you find that useful, I ripped it out of my other repo and pasted it
here: https://gist.github.com/plredmond/5fd15fb388647b248de87693542d2adb
On Thu, Sep 1, 2022 at 3:54 PM Ruben Astudillo
On 01-09-22 16:33, Dominik Schrempf wrote:
Chiming in here, maybe I missed something. Liquid Haskell is great, but in this case, in my opinion, easier is better:
newtype LeftFoo = LeftFoo !Int
newtype RightFoo = RightFoo !Char
data Foo = LFoo LeftFoo | RFoo RightFoo – Probably with strictness annotations.
isLeftFoo :: Foo -> Bool isLeftFoo (LFoo _) = True isLeftFoo _ = False
takesOnlyLeftFoo :: LeftFoo -> Int takesOnlyLeftFoo (LeftFoo i) = i
Dominik
Chiming in here too. I do this all the time if the subpart is to be used on 2 or more places. Easiest way to do this without extensions.
-- Rubén. (pgp: 1E88 3AC4 89EB FA22)
_______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.