Haskell 使用ST对向量进行可变修改
我一直在学习哈斯克尔学院关于“修改和圣蒙纳德”的教程。问题要求提出修改代码,该代码具有以下类型签名:Haskell 使用ST对向量进行可变修改,haskell,Haskell,我一直在学习哈斯克尔学院关于“修改和圣蒙纳德”的教程。问题要求提出修改代码,该代码具有以下类型签名:modify::Unbox a=>(对于所有s.MVector s a->ST s())->Vector a->Vector a 这就是函数的作用: 创建与原始向量长度相同的新可变缓冲区 将原始向量中的值复制到新的可变向量中 对提供的可变向量运行提供的ST操作 不安全地冻结可变向量并返回它 还可以使用Control.Monad.ST中的runST 我一直在玩弄它,但是我无法从sts()到向量a 这
modify::Unbox a=>(对于所有s.MVector s a->ST s())->Vector a->Vector a
这就是函数的作用:
sts()
到向量a
这就是我所拥有的:
{-# LANGUAGE RankNTypes #-}
module Chp28v8 where
import Control.Monad.ST
import Data.STRef
import qualified Data.Vector.Unboxed as V
modify' :: V.Unbox a => (forall s. MVector s a -> ST s ()) ->
V.Vector a -> V.Vector a
modify' fn v = runST $ do
vm <- V.unsafeThaw v >>= newSTRef
modifySTRef vm fn
vm >>= V.unsafeFreeze
{-#语言等级}
模块Chp28v8,其中
进口管制站
导入数据.STRef
导入符合条件的数据.Vector.unbox为V
修改“::V.Unbox a=>(对于所有s.MVector SA->ST s())->
V.向量a->V.向量a
修改'fn v=runST$do
vm>=newSTRef
modifySTRef vm fn
vm>>=V.unsafeFreeze
{-#语言等级}
模块Chp28v8,其中
进口管制站
导入符合条件的数据.Vector.unbox为V
导入Data.Vector.unbox.Mutable
修改“::V.Unbox a=>(对于所有s.MVector SA->ST s())->
V.向量a->V.向量a
修改'fn v=runST$do
请给我们一个起点。包括你尝试过的代码,以及哪里出了问题。FWIW,我不同意投票结果。这是一个非常合理的问题,如果它包含了更多关于尝试了什么但没有起作用的信息。你知道如何做这个简单的练习吗:编写一个modify
,只使用unsafeThaw
然后是函数,然后是unsafeFreeze
?这将包含一个小的DO块,中间有一行,它有类型<代码> st s(),但是最后一行将有类型<代码> st s(vector a)< /Cord> >中间,您将应用给定的修改函数,它具有类型<代码>(FALALL S.MVector S A->ST S())< />代码,但是应用它的结果将有类型<代码> ST S()。
unsafeThaw
不会复制原始向量。您可能想改用saw
。将unsafeThaw更改为saw不会改变任何东西。
{-# LANGUAGE RankNTypes #-}
module Chp28v8 where
import Control.Monad.ST
import qualified Data.Vector.Unboxed as V
import Data.Vector.Unboxed.Mutable
modify' :: V.Unbox a => (forall s. MVector s a -> ST s ()) ->
V.Vector a -> V.Vector a
modify' fn v = runST $ do
vm <- V.thaw v
fn vm
V.unsafeFreeze vm