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
。这可能吗?还有哪些其他解决方法?
我想说为此特定目的引入类型类是有意义的。不实际进行转换,只是将受限版本别名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)