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