Haskell 使用Data.Vector.Generic接口

Haskell 使用Data.Vector.Generic接口,haskell,vector,Haskell,Vector,在使用泛型向量接口时,我在定义类型签名时遇到了一些问题。我想构造一个可以同时处理装箱和未装箱向量的方法 这是可行的,但受限于装箱向量: import Control.Monad.ST import Data.Vector as V import Data.Vector.Generic as VG import Data.Vector.Generic.Mutable as

在使用泛型向量接口时,我在定义类型签名时遇到了一些问题。我想构造一个可以同时处理装箱和未装箱向量的方法

这是可行的,但受限于装箱向量:

import           Control.Monad.ST
import           Data.Vector                 as V
import           Data.Vector.Generic         as VG
import           Data.Vector.Generic.Mutable as VGM
import           Data.Vector.Mutable         as VM
import           Data.Vector.Unboxed         as VU
import           Data.Vector.Unboxed.Mutable as VUM

mySwap :: V.Vector a -> V.Vector a
mySwap vec = runST $ do
  vec_mut <- V.thaw vec
  VM.swap vec_mut 0 1
  V.unsafeFreeze vec_mut
应为类型,但
VG.Vector va
具有种类
ghc prim-.4.0.0:ghc.prim.Constraint


通用
模块中,
向量
是一个类型类,需要用作约束,例如:

mySwap2 :: VG.Vector v a => v a -> v a

这意味着:
v
是一种能够容纳
a
s的向量。

我刚刚删除了类型签名,让GHC引导我:

gswap v = runST $ do
  vmut <- VG.thaw v
  VGM.swap vmut 0 1
  VG.unsafeFreeze vmut
添加
语言类型族后,它编译并
:t gswap
返回:

gswap
  :: (VG.Vector v a, VG.Vector v1 a, Mutable v1 ~ Mutable v) =>
     v a -> v1 a

但是,如果
v
v1
是同一类型,那么可变约束就基本满足了,您不需要TypeFamilies扩展。

让GHC成为您的朋友吧。还可以查找GHC,让它告诉您类型签名应该是哪一部分。
Illegal equational constraint Mutable v ~ Mutable v
(Use GADTs or TypeFamilies to permit this)
gswap
  :: (VG.Vector v a, VG.Vector v1 a, Mutable v1 ~ Mutable v) =>
     v a -> v1 a