Data.Vector具有以下功能:
modify :: (forall s. MVector s a -> ST s ()) -> Vector a -> Vector a是否可以创建一个函数,例如:
modify :: [(forall s. MVector s a -> ST s ())] -> Vector a -> Vector a我试过了
{-# LANGUAGE RankNTypes, ImpredicativeTypes #-}
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector as V
import Control.Monad.ST
import Control.Monad.Primitive
unsafeModify :: [(forall s . MV.MVector s Int -> ST s ())] -> V.Vector Int -> V.Vector Int
unsafeModify mods vec = runST $ do
mvec <- V.unsafeThaw vec
sequence_ (map ($ mvec) mods)
V.unsafeFreeze mvec但我明白错误
Muts.hs:11:28:
Couldn't match type ‘forall s1. V.MVector s1 Int -> ST s1 ()’
with ‘V.MVector s Int -> ST s a0’
Expected type: [V.MVector s Int -> ST s a0]
Actual type: [forall s. V.MVector s Int -> ST s ()]
Relevant bindings include
mvec :: V.MVector s Int (bound at Muts.hs:10:5)
In the second argument of ‘map’, namely ‘mods’
In the first argument of ‘sequence’, namely ‘(map ($ mvec) mods)’发布于 2015-09-06 05:49:40
更改unsafeModify的类型。特别是,将forall s.浮动到列表之外。您希望您的所有函数共享相同的状态令牌(这是由runST确定的),因此不需要每个函数都可能使用另一个s
{-# LANGUAGE RankNTypes #-}
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector as V
import Control.Monad (mapM_)
import Control.Monad.ST
import Control.Monad.Primitive
unsafeModify :: (forall s . [MV.MVector s Int -> ST s ()]) -> V.Vector Int -> V.Vector Int
unsafeModify mods vec = runST $ do
mvec <- V.unsafeThaw vec
mapM_ ($ mvec) mods
V.unsafeFreeze mvec发布于 2015-09-06 00:43:39
通常的诀窍是将您的功能打包起来,因此:
data Box a = Box { unBox :: forall s. MVector s a -> ST s () }
modifyAll :: [Box a] -> Vector a -> Vector a
modifyAll fs = modify (\mvector -> mapM_ (\b -> unBox b mvector) fs)发布于 2015-09-05 21:31:59
这对我来说很管用:
{-# LANGUAGE RankNTypes, ImpredicativeTypes #-}
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
import Control.Monad.ST
vmods :: [ forall s. ( V.MVector s a -> ST s () ) ] -> V.Vector a -> V.Vector a
vmods [] v = v
vmods (m:ms) v = vmods ms $ V.modify m v
m1 v = MV.write v 0 'x'
m2 v = MV.write v 1 'y'
m3 v = MV.write v 2 'z'
test = vmods [m1,m2,m3] $ V.replicate 3 'a'https://stackoverflow.com/questions/32417542
复制相似问题