我正在Haskell中生成一个州的邻居。
状态是行列表。可以在一行上独立执行操作。在每一行上调用一个函数,该函数返回该行的一组邻居。
这是一个例子(为简单起见,我会将这些行设为字符):
state = ['a', 'b', 'c']
rowNeighbours a = ['x', 'y']
rowNeighbours c = ['p', 'q']
rowNeighbours _ = []
neighbours
应在每一行调用rowNeighbours
并生成状态列表[['x', 'b', 'c'], ['y', 'b', 'c'], ['a', 'b', 'p'], ['a', 'b', 'q']]
。
我在生成此列表时遇到问题。以下是我提出的解决方案。
neighbours state =
[ [x, y, z] | x <- rowNeighbours (state !! 0), y <- [state !! 1], z <- [state !! 2] ] ++
[ [x, y, z] | x <- [state !! 0], y <- rowNeighbours (state !! 1), z <- [state !! 2] ] ++
[ [x, y, z] | x <- [state !! 0], y <- [state !! 1], z <- rowNeighbours (state !! 2) ]
它有效,但我的实际问题有'6'行,所以这变得非常不优雅,看起来像是一种非功能性的做事方式。我很感激有关如何做到这一点的任何指示,谢谢。
答案 0 :(得分:2)
我认为这会做你想做的事:
neighbors (s:tate) = map (: tate) (rowNeighbors s) ++ map (s :) (neighbors tate)
neighbors [] = []