【发布时间】: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 中调用它们才会执行?