Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用ST对向量进行可变修改_Haskell - Fatal编程技术网

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
这就是函数的作用:

  • 创建与原始向量长度相同的新可变缓冲区
  • 将原始向量中的值复制到新的可变向量中
  • 对提供的可变向量运行提供的ST操作
  • 不安全地冻结可变向量并返回它
  • 还可以使用Control.Monad.ST中的runST

    我一直在玩弄它,但是我无法从
    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