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