GHC 7.8 中的角色代码损坏
Posted
技术标签:
【中文标题】GHC 7.8 中的角色代码损坏【英文标题】:Broken code with roles in GHC 7.8 【发布时间】:2014-04-15 06:34:57 【问题描述】:最新版本的 ghc 7.8.2 破坏了我的一些代码。
我正在使用GeneralizedNewtypeDeriving
派生Data.Vector.Unbox
的实例,使用以下内容:
data VoxelPos = VoxelPos
-# UNPACK #- !Int
-# UNPACK #- !Int
-# UNPACK #- !Int
deriving (Show, Eq, Ord)
newtype FacePos = FacePos VoxelPos deriving ( Eq, Hashable, NFData, G.Vector U.Vector, M.MVector U.MVector, U.Unbox)
其中VoxelPos
使用(Int, Int, Int)
手动滚动实例:
newtype instance U.MVector s VoxelPos = MV_VoxelPos (U.MVector s (Int, Int, Int))
newtype instance U.Vector VoxelPos = V_VoxelPos (U.Vector (Int, Int, Int))
instance U.Unbox VoxelPos
instance M.MVector U.MVector VoxelPos where
basicLength (MV_VoxelPos v) ...
...
这适用于以前版本的 ghc。但是升级 ghc 后,我得到以下错误:
Could not coerce from ‘U.MVector s (Int, Int, Int)’ to ‘U.MVector
s FacePos’
because the second type argument of ‘U.MVector’ has role Nominal,
but the arguments ‘(Int, Int, Int)’ and ‘FacePos’ differ
arising from the coercion of the method ‘M.basicLength’ from type
‘forall s. U.MVector s VoxelPos -> Int’ to type
‘forall s. U.MVector s FacePos -> Int’
Possible fix:
use a standalone 'deriving instance' declaration,
so you can specify the instance context yourself
When deriving the instance for (M.MVector U.MVector FacePos)
我认为这是因为增加了角色。我知道使用GeneralizedNewtypeDeriving
时角色可以提高安全性,这当然非常好!
有什么可能的解决方案来解决这个问题?什么是最推荐的?
【问题讨论】:
根据文档 (haskell.org/ghc/docs/7.8.2/html/users_guide/roles.html) ,您必须更改数据类型的角色,但我相信这只能在数据类型的定义中完成。我不确定角色如何与数据系列交互 - 也许您可以在每个实例的基础上定义角色 - 但我对此表示怀疑。 但是要更改MVector
的角色,我应该在vector
库上更改它。也许我应该向vector
包的维护者报告。
【参考方案1】:
这里有一个错误是明智的——FacePos
的U.MVector
实例可能与VoxelPos
的实例完全无关。不过,有一个很好的方法可以解决这个问题:
newtype instance U.MVector s FacePos = MV_FacePos (U.MVector s VoxelPos)
这应该可以消除您看到的特定错误。
但是,我认为您会立即遇到另一个与角色相关的错误,因为其他函数(不是 basicLength
,您遇到的问题)以角色当前无法处理的方式使用 MVector
参数.
GHC 团队已意识到此问题并正在努力解决:请参阅 https://ghc.haskell.org/trac/ghc/ticket/9112 和 https://ghc.haskell.org/trac/ghc/ticket/9123
与此同时,恐怕我唯一的建议是使用unsafeCoerce
。 :(
【讨论】:
感谢您回答这个问题。你能解释一下我们如何使用unsafeCoerce
来解决这个问题吗?以上是关于GHC 7.8 中的角色代码损坏的主要内容,如果未能解决你的问题,请参考以下文章