2016-10-28 11 views
1

私は2次元配列を横断しようとしていますが、これまでのところ、すべての要素で呼び出される関数がありますが、式を実行する基本的な概念は何か分かりません次のようにその関数の内部で、私はこれまで持っていることは次のとおりです。Haskell Repa - 2次元配列を横切る

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に関するものを無視することができ、これがゲームになるだろう。私はtryTile関数で副作用のある関数を試してみるとコンパイルエラーが出ます。どのようにして何らかの表現を実行するにはどうすればいいですか? repa配列の各要素に関数を適用する他の簡単な方法はありますか?

+1

この種のものは、 'repa'のポイントに反しています(これは可能ではないとは限りません)。 'repa'はすべて異なる形状の配列の計算を並列化することです。しかしながら、「IO」は事実上シーケンシャルである。また、 'traverse'は' Data.Traversable.traverse'と同じことを意味しません... – Alec

+1

私の実際のコードにはData.Array.Repa.traverseと書かれていますが、ありがたいことに、ちょっと頭痛でした。これが理にかなっているかどうかを教えてください。GL描画の各フレームで並列化が必要なので、たとえ各フレームがシーケンシャルであっても、各フレームのすべての個々のコンポーネントの描画は平行です。素早く返信してくれてありがとう –

+1

個々のコンポーネントを個別に描画することができれば、 'drawTile'を純粋なものにして、配列を折り畳んで純粋なコンポーネントを結合し、実際に画面に描画することができます。 – Alec

答えて

1

私が提案して、IOのリストを返し、次の機能を使用して一緒にそれらすべてを、配列決定どのようなユーザーアレックました:

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

おかげで再び助けを。将来の参照のために、私は誤ってIOを渡していましたが、問題はrepaではありませんでした。