Pointer equality for nullary constructors

Pointer equality for nullary constructors

Can I use reallyUnsafePtrEquality# reliably to identify whether a value is a nullary constructor of a particular type? For example, if I have

data Foo = Foo

Can I write

isFoo :: a -> Bool

isFoo !a = isTrue# (reallyUnsafePtrEquality# a Foo)

instead of

isFoo :: forall a. Typeable a => a -> Bool

isFoo a

| Just Refl <- eqTypeRep (typeRep @a) (typeRep @Foo)

, Foo <- a

= True

| otherwise = False

The reason I'm asking is because this would let me (potentially) raiseIO# a nullary constructor and then catch# it and see if it was what I was looking for rather than having to open a SomeException to get to an Exception dictionary, open that to get a TypeRep, and then peer inside that to check a Fingerprint. That is, I'd get lighter-weight exceptions that only carry the information I actually need.

Re: Pointer equality for nullary constructors

Can I use reallyUnsafePtrEquality# reliably to identify whether a value is a nullary constructor of a particular type? For example, if I have

data Foo = Foo

Can I write

isFoo :: a -> Bool

isFoo !a = isTrue# (reallyUnsafePtrEquality# a Foo)

instead of

isFoo :: forall a. Typeable a => a -> Bool

isFoo a

| Just Refl <- eqTypeRep (typeRep @a) (typeRep @Foo)

, Foo <- a

= True

| otherwise = False

The reason I'm asking is because this would let me (potentially) raiseIO# a nullary constructor and then catch# it and see if it was what I was looking for rather than having to open a SomeException to get to an Exception dictionary, open that to get a TypeRep, and then peer inside that to check a Fingerprint. That is, I'd get lighter-weight exceptions that only carry the information I actually need.

Can I use reallyUnsafePtrEquality# reliably to identify whether a value is a nullary constructor of a particular type? For example, if I have

data Foo = Foo

Can I write

isFoo :: a -> Bool

isFoo !a = isTrue# (reallyUnsafePtrEquality# a Foo)

instead of

isFoo :: forall a. Typeable a => a -> Bool

isFoo a

| Just Refl <- eqTypeRep (typeRep @a) (typeRep @Foo)

, Foo <- a

= True

| otherwise = False

The reason I'm asking is because this would let me (potentially) raiseIO# a nullary constructor and then catch# it and see if it was what I was looking for rather than having to open a SomeException to get to an Exception dictionary, open that to get a TypeRep, and then peer inside that to check a Fingerprint. That is, I'd get lighter-weight exceptions that only carry the information I actually need.