Arrays 在Haskell中,如何将不可变数组从特定索引复制到可变数组中

Arrays 在Haskell中,如何将不可变数组从特定索引复制到可变数组中,arrays,haskell,functional-programming,copy,Arrays,Haskell,Functional Programming,Copy,我有以下两种类型的数组: a :: IOArray Word16 Word16 b :: [Word16] 我需要一个函数copyAtPositionI,它将数组b的所有元素复制到数组a中,从数组a的第I个索引开始。可以假设索引不会试图将元素复制到数组a的边界之外 该功能应为以下类型: copyAtPositionI :: IOArray Word16 Word16 -> [Word16] -> Word16 -> IO () 例如(这不是Haskell) 复制位置i a

我有以下两种类型的数组:

a :: IOArray Word16 Word16
b :: [Word16]
我需要一个函数copyAtPositionI,它将数组b的所有元素复制到数组a中,从数组a的第I个索引开始。可以假设索引不会试图将元素复制到数组a的边界之外

该功能应为以下类型:

copyAtPositionI :: IOArray Word16 Word16 -> [Word16] -> Word16 -> IO ()
例如(这不是Haskell)

复制位置i a b 3应导致a等于[1,2,3,10,11,12,13,8,9]


我在Data.Array.IO包中找不到任何完全符合我要求的函数。我只在Data.Array.MArray包中找到了函数,但我不知道如何为数组b中的每个元素执行函数。您可以使用
zipWithM

copyAtPositionI mut imm i = zipWithM_ (writeArray mut) [i..] imm
如果没有,您可以用一种非常简单的方式实现它:

zipWithM_ f (x:xs) (y:ys) = f x y >> zipWithM_ f xs ys
zipWithM_ f _ _ = return ()

您可以使用zipWithM:

copyAtPositionI mut imm i = zipWithM_ (writeArray mut) [i..] imm
如果没有,您可以用一种非常简单的方式实现它:

zipWithM_ f (x:xs) (y:ys) = f x y >> zipWithM_ f xs ys
zipWithM_ f _ _ = return ()

听起来你只需要在你的列表上插入一个动作。你能更具体一点吗?我很难理解如何使用索引来应用它。听起来你只需要在列表
b
上插入一个操作。你能更具体一点吗?我很难理解如何使用索引来应用它。你是我的英雄。你是我的英雄。