Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 对于可变向量是否有一个就地映射函数?_Haskell_Vector - Fatal编程技术网

Haskell 对于可变向量是否有一个就地映射函数?

Haskell 对于可变向量是否有一个就地映射函数?,haskell,vector,Haskell,Vector,例如,如果我有一个类型为IOVector a的可变向量,是否有一个类似于map的函数可以修改元素 vector包提供修改功能,但一次只能修改一个元素。我应该使用这个方法还是有更好的方法 为了澄清这一点,向量的类型在前后都是相同的。是的,如果要在适当的位置修改元素,请使用“修改”。如果您发现自己经常在适当的位置修改所有内容,则可以按如下方式定义mapModify import Data.Foldable (for_) import qualified Data.Vector.Mutable as

例如,如果我有一个类型为IOVector a的可变向量,是否有一个类似于map的函数可以修改元素

vector包提供修改功能,但一次只能修改一个元素。我应该使用这个方法还是有更好的方法

为了澄清这一点,向量的类型在前后都是相同的。

是的,如果要在适当的位置修改元素,请使用“修改”。如果您发现自己经常在适当的位置修改所有内容,则可以按如下方式定义mapModify

import Data.Foldable (for_)
import qualified Data.Vector.Mutable as MV

mapModify :: (a -> a) -> IOVector a -> IO ()
mapModify f v = for_ [0 .. MV.length v - 1)] (MV.modify v f)
也就是说,不断修改一个向量中的所有元素听起来似乎最好使用不可变向量,并使用常规fmap对其进行映射。如果该代码最终正确融合,则中间向量将永远不会具体化。

是的,如果要在适当位置修改元素,请使用modify。如果您发现自己经常在适当的位置修改所有内容,则可以按如下方式定义mapModify

import Data.Foldable (for_)
import qualified Data.Vector.Mutable as MV

mapModify :: (a -> a) -> IOVector a -> IO ()
mapModify f v = for_ [0 .. MV.length v - 1)] (MV.modify v f)

也就是说,不断修改一个向量中的所有元素听起来似乎最好使用不可变向量,并使用常规fmap对其进行映射。如果该代码最终正确融合,中间向量将永远不会具体化。

我不熟悉如何使用融合,但听起来使用不可变向量可能是最好的选择。@user668074,您可能不想像这样修改所有元素的一个原因是懒惰可能会降低效率。在安装之前强制每个结果的mapModify可能更有用。如果lazy pure版本与其他操作融合,也可以。我不熟悉如何使用融合,但听起来使用不可变向量可能是最好的选择。@user668074,您可能不想像这样修改所有元素的一个原因是,懒惰可能会降低效率。在安装之前强制每个结果的mapModify可能更有用。如果惰性纯版本与其他操作相融合,也可以。