允许类型角色覆盖

Tre*_*bor 4 haskell types coercion ghc newtype

在 GHC Haskell 中,Map k v有一个类型角色声明k是名义上的。这是因为用户可以以其他coerce k方式使用具有相同表示但不同实例的另一种Ord类型,从而破坏不变量。

但是,我有一些Ord实例是继承的新类型。在这种情况下,unsafeCoerce似乎可以完成这项工作(如果有我不知道的微妙之处,请纠正我),但这完全关闭了强制类型检查,这让我彻夜难眠。在我的具体用例中,我有一个 type MyWrapper k,并且我希望能够声明一些新类型k1->k2作为安全强制转换的可接受类型,即使它是 的参数MyWrapper。这可能吗?还有哪些其他解决方法?

lef*_*out 6

我想说为此特定目的引入类型类是有意义的。不实际进行转换,只是将受限版本别名unsafeCoerce为实际上安全的情况。

{-# LANGUAGE MultiParamTypeClasses #-}

class (Ord a, Ord b) => CompatibleOrd a b
  -- no methods

instance CompatibleOrd YourBaseType YourNewtype

coerceKeysMonotonically :: (Coercible a b, CompatibleOrd a b)
          => Map a y -> Map b y
coerceKeysMonotonically = unsafeCoerce
Run Code Online (Sandbox Code Playgroud)