【问题标题】:Haskell Repa - traversing a 2D arrayHaskell Repa - 遍历二维数组
【发布时间】:2016-10-28 16:39:06
【问题描述】:

我正在尝试遍历我使用 repa 创建的 2D 数组,到目前为止,我有在每个元素上调用的函数,但我不明白存在什么基本概念不会让我在该函数中执行表达式,我有什么到目前为止如下:

 drawTile ::(DIM2 -> Int) -> DIM2 -> Int
 drawTile f (Z :. i :. j) = do
   <this is where i want to do some IO>

 drawScene :: [GLuint] -> Array U DIM2 Int -> GLFW.Window -> IO()
 drawScene texs map win = do
   x <- computeP $(traverse map id drawTile)::IO (Array UDIM2 Int)
   return ()

您可以忽略有关纹理和 OpenGL 的内容,这将是一款游戏。当我尝试在 drawTile 函数中使用具有副作用的函数时出现编译错误。我如何在我想要的地方执行某种表达式(例如打印“hello”)?还有其他更简单的方法可以将函数应用于 repa 数组中的每个元素吗?

【问题讨论】:

  • 这种做法违背了repa 的观点(但这并不是说这是不可能的)。 repa 是关于在不同形状的数组上并行计算。但是,IO 本质上是连续的。此外,traverse 与Data.Traversable.traverse 的含义不同...
  • 在我的实际代码中显示为 Data.Array.Repa.traverse,但谢谢,这有点让人头疼。让我知道这是否有意义,我希望在 GL 绘图的每一帧上进行并行化,这样,即使每一帧都是连续的,每一帧的所有单独组件的绘图都是平行的。感谢您的快速回复
  • 如果每个单独的组件都可以独立绘制,您可以尝试将drawTile设为pure,然后将数组折叠以组合纯组件,最后实际绘制到屏幕上。
  • 你是说我可以预先创建纯函数,将它们组合在一起,直到我在 main 中调用它们才会执行?

标签: haskell repa


【解决方案1】:

我按照用户 alec 的建议做了,并返回了一个 IO 列表,然后使用以下函数将它们全部排序:

resequence_ :: [IO ()] -> IO ()
resequence_ = foldr (>>) (return ())

再次感谢您的帮助。为了将来参考,我错误地传递了 IO,问题不在于 repa。

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2013-03-14
    • 1970-01-01
    • 2014-12-22
    • 2011-07-18
    相关资源
    最近更新 更多