<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Feb 11, 2018 at 5:14 AM, David Feuer <span dir="ltr"><<a href="mailto:david.feuer@gmail.com" target="_blank">david.feuer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="auto">Can I use reallyUnsafePtrEquality# reliably to identify whether a value is a nullary constructor of a particular type? For example, if I have<div dir="auto"><br></div><div dir="auto">data Foo = Foo</div><div dir="auto"><br></div><div dir="auto">Can I write</div><div dir="auto"><br></div><div dir="auto">isFoo :: a -> Bool</div><div dir="auto">isFoo !a = isTrue# (reallyUnsafePtrEquality# a Foo)</div></div></div></blockquote><div><br></div><div>You mean like this? <a href="https://github.com/gregorycollins/hashtables/blob/master/src/Data/HashTable/Internal/UnsafeTricks.hs#L72">https://github.com/gregorycollins/hashtables/blob/master/src/Data/HashTable/Internal/UnsafeTricks.hs#L72</a></div><div><br></div><div>My experience is that this works, except when doing coverage, where the compiler adds instrumentation code that breaks the technique. I #ifdef'd my way around the problem, swapping out a slower impl when I was doing code coverage.</div><div><br></div><div>Greg</div></div>
</div></div>