1

我在 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”行,所以这变得非常不雅,看起来像是一种非功能性的做事方式。我将不胜感激有关如何执行此操作的任何指示,谢谢。

4

1 回答 1

2

我认为这会做你想要的:

neighbors (s:tate) = map (: tate) (rowNeighbors s) ++ map (s :) (neighbors tate)
neighbors [] = []
于 2013-10-28T21:33:41.097 回答