生成州的邻居列表

时间:2013-10-28 21:27:23

标签: haskell

我正在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'行,所以这变得非常不优雅,看起来像是一种非功能性的做事方式。我很感激有关如何做到这一点的任何指示,谢谢。

1 个答案:

答案 0 :(得分:2)

我认为这会做你想做的事:

neighbors (s:tate) = map (: tate) (rowNeighbors s) ++ map (s :) (neighbors tate)
neighbors [] = []