【问题标题】:In Haskell, how to copy immutable array into a mutable array from a specific index在 Haskell 中,如何将不可变数组从特定索引复制到可变数组中
【发布时间】:2018-09-12 02:15:54
【问题描述】:

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

a :: IOArray Word16 Word16
b :: [Word16]

我想要一个函数 copyAtPositionI 将数组 b 的所有元素复制到数组 a 中,从数组 的第 i 个索引开始>一个。可以假设索引不会尝试将元素复制到数组 a 的边界之外。

函数应为以下类型:

copyAtPositionI :: IOArray Word16 Word16 -> [Word16] -> Word16 -> IO ()

例如(这不是 Haskell),

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [10, 11, 12, 13]

copyAtPositionI ab 3 应该导致 a 等于 [1, 2, 3, 10, 11, 12, 13, 8, 9]

我没有在 Data.Array.IO 包中找到任何符合我要求的函数。我只在 Data.Array.MArray 包中找到了函数writeArray,但我不知道如何为数组 b 中的每个元素执行该函数。 p>

【问题讨论】:

  • 听起来您只需要mapM_ 对您的列表进行插入操作b
  • 您能说得更具体些吗?我很难理解如何使用索引来应用它。

标签: arrays haskell functional-programming copy


【解决方案1】:

你可以使用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 ()

【讨论】:

  • 你是我的英雄。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多