使用ST对Vector进行可变修饰

时间:2017-04-01 10:42:35

标签: haskell

我一直在经历一个关于"修改和ST monad"的Haskell学校教程。该问题要求提出具有以下类型签名的修改代码:modify :: Unbox a => (forall s. MVector s a -> ST s ()) -> Vector a -> Vector a 这就是函数的作用:

  1. 创建与原始向量
  2. 长度相同的新可变缓冲区
  3. 将原始载体中的值复制到新的可变载体
  4. 在提供的可变载体上运行提供的ST动作
  5. 不安全地冻结可变矢量并将其返回。
  6. 也可以使用Control.Monad.ST中的runST

    我一直在玩它但是我无法从ST s ()Vector 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
    

1 个答案:

答案 0 :(得分:1)

{-# 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