2011-05-14 1 views
0

내 임무의이 부분에서 일부 진전을 관리했지만 내가 만든 그 아래의 코드의 일부 첨부 :목록 그리드 요소

module Grid where 

data State = On | Off deriving (Eq, Show) 


next :: State -> State 
next On = Off 
next Off = On 

type Row = [State] 
type Grid = [[State]] 
type Point = (Int,Int) 

initialRow  :: Int -> Row 
initialRow w = replicate w Off 


updateRow :: Row -> Int -> Row 
updateRow (r:rs) x 
    | x==0  = next r:rs 
    | otherwise = r : (updateRow rs (x-1)) 

update :: Grid -> Point -> Grid 
update [[]] (x,y)  = [[]] 
update [(g:gs)] (x,y) = [(updateRow (g:gs) x)] 

바로 위의 마지막 줄에 나타낸 바와 같이, 내가 가진를 아래 그림과 같이 x = 임의의 Int 일 때 작동하도록 업데이트를 얻을 수 있습니다 (x 번째 요소가 반전 된 경우) - ghci.

*Grid> update [[Off,Off,Off,Off],[Off,Off,Off,Off]] (2,0) 
*** Exception: Grid.hs:(24,0)-(25,47): Non-exhaustive patterns in function update 

I가없는 것 : 나는 이와 같은 여러 목록 작업을 시도하거나 x 번째 요소를 업데이트 목록 내에서 특정 목록을 선택하면

*Grid> update [[Off,Off,Off,Off]] (2,0) 
[[Off,Off,On,Off]] 
*Grid> 

그것은 모든 그러나 떨어진 온다 이 함수에서 공식을 '제랄 화'하십시오.

updateRow :: Grid -> Point -> Grid 

기본적으로, 내가 뭘하고 싶은 것은이 같은에서 업데이트입니다 ... 이것에

[[Off,Off,Off,Off], 
[Off,Off,Off,Off], 
[Off,Off,Off,Off], 
[Off,Off Off,Off]] 

:

[[Off,Off,Off,Off], 
[Off,Off,**On**,Off], 
[Off,Off,Off,Off], 
[Off,Off Off,Off]] 

또한이 유형의 규칙을 따라야합니다

여기서 'x'는 요소 값이고 'y'는 IYGWIM 목록 내의 목록 값입니다.

미리 감사드립니다.

+0

그것은 당신에게 명확하게 수를 'data Grid = [[State]]' –

답변

2
update :: Grid -> Point -> Grid 
update [[]] (x,y)  = [[]] 

빈 목록이 들어있는 목록을 확인합니다.

update [(g:gs)] (x,y) = [(updateRow (g:gs) x)] 

하나의 목록 (변수 g에 바인딩 된 하나 이상의 요소 포함)이 포함 된 목록을 확인합니다.

여러 목록을 포함하는 목록을 확인하려고합니다.

update :: Grid -> Point -> Grid 
update [[]] (x, y)  = [[]] 
update (row:rows) (x, 0) = updateRow row x : rows 
update (row:rows) (x,y) = -- I'll let you fill this, notice the 0 on the previous line 

Grid이 의 단지 목록입니다 기억처럼

패턴이 보일 것입니다.

두 번째 줄은 "이 그리드의 0 번째 줄을 업데이트하고 첫 번째 줄을 업데이트하려는 경우 마지막 줄은"이 그리드의 y 번째 줄을 업데이트하려는 경우 "다음을 의미합니다. 첫 번째 것은 그대로이고 재귀 적으로 나머지 행을 업데이트합니다 "(물론 y는 재귀 호출에 따라 변경되어야합니다).

+0

OK! 나는 그것을 알아! – maclunian

0

여기 해결책이 있습니다. 몇 가지 생각 후에, 나는 다음과 같이 나와서 위의 '패턴'의 마지막 줄 작성 : 데이터 그리드 = [행]를`에 해당하는 당신이`정의하면

... 
update  (g:gs) (x,y) = g : update gs (x,(y-1))