如何使用generizednewtypederived来派生Vector和MVector?



接近Data.Vector的黑线顶部。在未装箱的情况下,讨论了如何使用generalizednewtypederived派生VectorMVector的实例。下面的示例,编辑为使用LANGUAGEpragmas,如下所示:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Generic.Mutable as M
import qualified Data.Vector.Unboxed as U
newtype Foo = Foo Int
newtype instance U.MVector s Foo = MV_Int (U.MVector s Int)
newtype instance U.Vector Foo = V_Int (U.Vector Int)
deriving instance M.MVector U.MVector Foo
deriving instance G.Vector U.Vector Foo
instance U.Unbox Foo

但是,它不进行类型检查,失败时显示以

开头的长消息。
• Couldn't match representation of type: m Int
with that of: m Foo
arising from a use of ‘GHC.Prim.coerce’
NB: We cannot know what roles the parameters to ‘m’ have;
we must assume that the role is nominal
• In the expression:
GHC.Prim.coerce
@(U.MVector (Control.Monad.Primitive.PrimState m) Int
-> Int -> m Int)
@(U.MVector (Control.Monad.Primitive.PrimState m) Foo
-> Int -> m Foo)
(M.basicUnsafeRead @U.MVector @Int)
In an equation for ‘M.basicUnsafeRead’:
M.basicUnsafeRead
= GHC.Prim.coerce
@(U.MVector (Control.Monad.Primitive.PrimState m) Int
-> Int -> m Int)
@(U.MVector (Control.Monad.Primitive.PrimState m) Foo
-> Int -> m Foo)
(M.basicUnsafeRead @U.MVector @Int)

这个例子在某种程度上是错误的或缺乏的,但我不知道如何修复它。

我要注意的是,我可以很容易地使用data . vector . unboxes . derived(或者手动写出所有内容):

derivingUnbox
"Foo"
[t|Foo -> Int|]
[|(Foo i) -> i|]
[|Foo|]

我对GeneralizedNewTypeDeriving的理解是,它避免了我在上面必须做的琐碎的应用程序和构造函数的删除,所以如果可能的话,我希望能够在这里使用它。

编辑:每个请求,我使用堆栈解析器ltts -19.33,这是在ghc-9.0.2

最近,vector0.13.0.0版本进行了更改,允许使用GeneralizedNewtypeDeriving派生其类(更改日志)。事实上,在那之前,这是不可能的。由于您正在使用vector0.12.3.1版本(通过lts-19.33),因此解决方案是升级到最新版本。

最新更新