hey David, heres a simpler version (attached below), that I think accomplishes the same goal.One issue, that would need to be evaluated empirically: how many type class instances would break from this change? Would any?is it Storable instances that are an issue, or things that use storable?what safety is gained vs what is impacted? (i guess i mostly just wanna understand what would be broken by this change, a lot of code in the wild uses pointers for systems integrations)newtype Ptr a = Ptr Addr#type role Ptr nominalcastPtr :: Ptr a -> Ptr bcastPtr = unsafeCoerceptrCoercible:: ((forall a b. Coercible (Ptr a) (Ptr b)) => r)-> rptrCoercible r = rptrCoercion :: Coercion (Ptr a) (Ptr b)ptrCoercion = CoercionOn Tue, Oct 30, 2018 at 1:57 PM David Feuer <david.feuer@gmail.com> wrote:Currently, we have_______________________________________________data Ptr a = Ptr Addr#type role Ptr phantomThis is weird: accidentally coercing a pointer to a different type is very bad. The only reason Ptr has this role is that without it, castPtr and such may not be free or will involve unsafe coercions.Thankfully, we have enough power to fix this now.data Addr = Ptr_ Addr#newtype Ptr a = Ptr_ Addrtype role Ptr nominalpattern Ptr :: Addr# -> Ptr apattern Ptr a# = Ptr_ (Addr a#)castPtr :: Ptr a -> Ptr bcastPtr (Ptr a) = Ptr aptrCoercible:: ((forall a b. Coercible (Ptr a) (Ptr b)) => r)-> rptrCoercible r = rptrCoercion :: Coercion (Ptr a) (Ptr b)ptrCoercion = CoercionI propose that we do this.
Libraries mailing list
Libraries@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries