首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建像"Data.Vector.modify“这样的接收列表的函数?

如何创建像"Data.Vector.modify“这样的接收列表的函数?
EN

Stack Overflow用户
提问于 2015-09-05 20:49:31
回答 4查看 122关注 0票数 2

Data.Vector具有以下功能:

代码语言:javascript
复制
modify :: (forall s. MVector s a -> ST s ()) -> Vector a -> Vector a

是否可以创建一个函数,例如:

代码语言:javascript
复制
modify :: [(forall s. MVector s a -> ST s ())] -> Vector a -> Vector a

我试过了

代码语言:javascript
复制
{-# 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

但我明白错误

代码语言:javascript
复制
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)’
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-06 05:49:40

更改unsafeModify的类型。特别是,将forall s.浮动到列表之外。您希望您的所有函数共享相同的状态令牌(这是由runST确定的),因此不需要每个函数都可能使用另一个s

代码语言:javascript
复制
{-# 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
票数 3
EN

Stack Overflow用户

发布于 2015-09-06 00:43:39

通常的诀窍是将您的功能打包起来,因此:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2015-09-05 21:31:59

这对我来说很管用:

代码语言:javascript
复制
{-# 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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32417542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档