如何为自定义newtype类型启用Unboxed Vectors支持?
解决Newtype无法推导Unbox实例以使用非装箱向量的问题
你遇到的错误根源在于:Unbox类型类并非独立的简单类,它依赖于Vector、MVector以及类型族Unbox.Rep的关联实例,GeneralizedNewtypeDeriving无法自动推导这些关联组件,因此直接写deriving (Unbox)会编译失败。
下面提供两种可行的解决方案:
方案一:使用DerivingVia扩展(推荐)
这是最简洁的实现方式,通过指定X的Unbox实例基于Word64的现有实例派生,需要启用DerivingVia扩展:
{-# LANGUAGE DerivingVia #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeFamilies #-} module UnboxedTest where import Data.Vector.Unboxed import Data.Word newtype X = X Word64 deriving newtype (Eq, Ord, Show) -- 普通类型类仍用newtype推导 deriving Unbox via Word64 -- 指定Unbox实例通过Word64的实现派生
方案二:手动实现关联实例
如果不想使用DerivingVia,可以手动定义Unbox.Rep类型族实例,再依次推导Vector、MVector和Unbox实例:
{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeFamilies #-} module UnboxedTest where import Data.Vector.Unboxed import Data.Vector.Unboxed.Base (Vector(..), MVector(..)) import Data.Word newtype X = X Word64 deriving (Eq, Ord, Show) -- 指定X的底层非装箱表示与Word64一致 type instance Unbox.Rep X = Unbox.Rep Word64 -- 推导Vector实例 deriving instance Vector Vector X -- 推导MVector实例 deriving instance MVector MVector X -- 最终推导Unbox实例 deriving instance Unbox X
修改完成后,你就可以正常创建和使用Vector X了,示例代码:
sampleVector :: Vector X sampleVector = fromList [X 0x1234, X 0x5678]
内容的提问来源于stack exchange,提问作者user1002430
相关产品推荐
相关产品推荐

