Haskell 在可变函数中获取不可变向量的类型

Haskell 在可变函数中获取不可变向量的类型,haskell,Haskell,我有一个简单的就地函数,我使用可变向量来实现。但是,此函数需要一个向量,该向量最容易使用不可变向量构造。下面是一些演示基本结构的玩具代码(但可能未编译): 导入Data.Vector.Generic作为V 导入Data.Vector.unbox为U myvec::(向量vr)=>Int->vr myvec i=V.generate i id f::(MVector vr,PrimMonad m)=>v(PrimState m)r->m() fy=let v=myvec 10--'v'的类型应该是

我有一个简单的就地函数,我使用可变向量来实现。但是,此函数需要一个向量,该向量最容易使用不可变向量构造。下面是一些演示基本结构的玩具代码(但可能未编译):

导入Data.Vector.Generic作为V
导入Data.Vector.unbox为U
myvec::(向量vr)=>Int->vr
myvec i=V.generate i id
f::(MVector vr,PrimMonad m)=>v(PrimState m)r->m()
fy=let v=myvec 10--'v'的类型应该是什么?
--由于可变类型族不是内射的,以下操作不起作用:
_=返回v`asTypeOf`unsafey
在做。。。。
main=do
--在顶层,我知道输入可以解除绑定
设v=U,生成10(+(1::Int))

v'在深入研究之后,我想出了如何编写一个可变的
生成
函数:

import Data.Vector.Generic.Mutable as M
import Data.Vector.Fusion.Stream as S
import Control.Monad.Primitive

mutableGenerate :: (MVector v r, PrimMonad m) => Int -> (Int -> r) -> m (v (PrimState m) r)
mutableGenerate i f = M.unstream $ S.generate i f

这允许我生成一个多态可变向量,但使用不可变向量的简洁表示法。在我看来,这似乎是一个有用的函数,应该包含在
Data.Vector.Generic.Mutable

中,您不能传入类型吗<代码>f(未定义::Int)v'
?或者,您可以使用一些GADT来代替对
Vector
类如此通用吗?我不是这些方面的专家;我可以将不可变向量类型从
main
传递到
f
(不确定使用
undefined::Int
时要去哪里),但是当一个完全有效(尽管很难看)的另一种方法是将
myvec
作为可变函数写入。您希望用什么填充
myvec
生成的向量?如果它是不可变的,你需要在创建时知道。现在你已经得到它生成了一个
Int
索引的向量。我再看一遍,想知道为什么你不把解冻和冻结从
main
移到
f
。我可能错了,但我想任何不需要的冻结/解冻对结果都可能被编译掉。
import Data.Vector.Generic.Mutable as M
import Data.Vector.Fusion.Stream as S
import Control.Monad.Primitive

mutableGenerate :: (MVector v r, PrimMonad m) => Int -> (Int -> r) -> m (v (PrimState m) r)
mutableGenerate i f = M.unstream $ S.generate i f