gpt4 book ai didi

haskell - GHC 7.8 中角色的损坏代码

转载 作者:行者123 更新时间:2023-12-02 06:36:49 24 4
gpt4 key购买 nike

最新版本的 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 时可以提高安全性,这当然非常好!

有哪些可能的解决方案可以解决这个问题?最推荐的是哪一款?

最佳答案

此处出现错误是合理的 - FacePosU.MVector 实例可能与 VoxelPos 的实例完全无关。不过,有一个很好的方法可以解决这个问题:

newtype instance U.MVector s FacePos = MV_FacePos (U.MVector s VoxelPos)

这应该可以消除您所看到的特定错误。

但是,我认为您会立即遇到另一个与角色相关的错误,因为其他函数(不是您遇到的 basicLength)使用 MVector 参数以角色目前无法处理的方式。

GHC 团队已意识到此问题并正在努力解决:请参阅 https://ghc.haskell.org/trac/ghc/ticket/9112https://ghc.haskell.org/trac/ghc/ticket/9123

与此同时,恐怕我唯一的建议是使用unsafeCoerce。 :(

关于haskell - GHC 7.8 中角色的损坏代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23076197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com