Jef*_*own 3 state haskell vector mutable
MVector有两种口味,IOVector和STVector.我想编写一些使用的函数STVector,这样即使使用快速可变矢量算法也可以从纯代码中调用它们Data.Vector.Algorithms.
在相关主题的帮助下,我已经Vector到了那里:我可以将一个不可变的东西粘在一个可变的ST上下文中:
import Control.Monad.ST
import Data.Vector
import Data.Vector.Algorithms.Intro (sort)
x = fromList [1,4,2] :: Vector Int
verboseCopy :: Vector Int
verboseCopy = runST $ do v <- thaw x
freeze v
Run Code Online (Sandbox Code Playgroud)
我只需要sort在解冻和冻结之间运行.
也许令人惊讶的是,我没有必要import Data.Vector.Mutable,这STVector是定义的地方.也许我应该使用类型签名来指定我想要thaw生成一个STVector,但我不知道如何:如果我将thaw行更改为:
v <- thaw x :: Data.Vector.Mutable.STVector s Int
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
• Couldn't match expected type ‘MVector
(primitive-0.6.3.0:Control.Monad.Primitive.PrimState (ST s))
Int’
with actual type ‘Int’
• In the first argument of ‘freeze’, namely ‘v’
Run Code Online (Sandbox Code Playgroud)
你应该写得很好:
verboseCopy :: Vector Int
verboseCopy = runST $ do v <- thaw x
sort v
freeze v
Run Code Online (Sandbox Code Playgroud)
赠送:
> verboseCopy
[1,2,4]
>
Run Code Online (Sandbox Code Playgroud)
在sort v执行排序上的可变矢量的副作用v,所以没有必要"保存"或"捕获"排序结果,如果这就是你担心.
您不需要显式键入v.Haskell会推断它是一个可变的向量,并将它作为一个IOVector或者STVector根据你是在IO或ST monad中使用它来适当地对待它.
对于您的信息,您收到错误的原因是您提供的类型是v,但您已将其应用于thaw x具有更复杂类型的类型.如果你写:
verboseCopy :: Vector Int
verboseCopy = runST $ do v <- thaw x :: ST s (STVector s Int)
sort v
freeze v
Run Code Online (Sandbox Code Playgroud)
然后它会打字检查.然而,再次,这是不必要的,并且根本不会改变行为.Haskell已经为你找到了这种类型.
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |