【发布时间】:2011-05-14 04:30:40
【问题描述】:
我在这部分作业中取得了一些进展,但在下面附上了我所做的部分代码:
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 = any Int 时,我已经设法让更新工作,如下所示(第 x 个元素倒置) - ghci。
*Grid> update [[Off,Off,Off,Off]] (2,0)
[[Off,Off,On,Off]]
*Grid>
然而,当我尝试使用多个列表(例如这样)或选择列表中的某个列表来更新第 x 个元素时,这一切都没有解决:
*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 中列表的值。
提前致谢。
【问题讨论】:
-
你定义
data Grid = [Row]可能会更清楚,相当于data Grid = [[State]]
标签: list haskell element variable-assignment