Мне удалось добиться некоторого прогресса в этой части моего задания, но я приложил часть кода ниже, что я сделал:
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, как показано ниже (с инвертированным элементом xth) - ghci.
*Grid> update [[Off,Off,Off,Off]] (2,0)
[[Off,Off,On,Off]]
*Grid>
Однако все отклеивается, когда я пытаюсь работать с несколькими списками, такими как этот, или выбираю определенный список в списке, чтобы обновить элемент xth:
*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
Я не могу «обобщить» формулу в этой функции.
Я также ДОЛЖЕН следовать ЭТОМУ соглашению типов:
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.
Заранее спасибо.