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)’
更改的类型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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句