You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:30:52