2016-10-28 3 views
1

나는 repa를 사용하여 만든 2D 배열을 탐색하려고하는데, 지금까지는 모든 요소에 대해 호출되는 함수가 있지만 표현을 실행하지 않는 기본 개념이 무엇인지 이해하지 못합니다. 다음과 같이 그 함수 안에, 내가 지금까지 가지고하는 것은 :Haskell 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에 대한 물건을 무시할 수 있습니다,이 게임이 될 것입니다. tryTile 함수에서 부작용이있는 함수를 사용하려고하면 컴파일 오류가 발생합니다. 내가 원하는 곳에서 어떻게 표현 (print "hello")을 할 수 있을까? repa 배열의 각 요소에 함수를 적용하는 좀 더 쉬운 방법이 있습니까?

+1

이런 종류의 것은 'repa'의 요점에 반하는 것입니다.하지만 이것은 불가능합니다. 'repa'는 다른 모양의 배열에 대한 계산을 병렬 처리하는 것에 관한 것입니다. 그러나 'IO'는 사실 순차적이다. 또한'트래버스 '는'Data.Traversable.traverse'와 같은 것을 의미하지는 않습니다 ... – Alec

+1

내 실제 코드에 Data.Array.Repa.traverse라고 쓰여 있지만 감사합니다. 이것이 합리적이라면 GL 그리기의 각 프레임에서 병렬 처리가 필요하므로 각 프레임이 순차적이라고 생각하더라도 각 프레임의 모든 개별 구성 요소의 도면이 서로 평행하다는 것을 알 수 있습니다. 빠른 답장을 보내 주셔서 감사합니다 –

+1

개별 구성 요소 각각을 독립적으로 그릴 수 있다면'drawTile'을 순수하게 만들고 배열을 접어 순수한 구성 요소를 결합한 다음 실제로 화면에 그릴 수 있습니다. – Alec

답변

1

내가 제안하고 IO의 목록을 반환 한 다음 함수를 사용하여 함께 모든 염기 서열을 어떤 사용자 알렉했다 :

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

덕분에 다시 도움을. 나중에 참조하기 위해, 나는 실수로 IO를 지나쳤으며, 문제는 repa를 사용하지 않았습니다.