Haskell在列表列表中定位元素

时间:2013-11-09 22:50:54

标签: haskell

好的,我是Haskell的新手,需要帮助我解决问题的功能方法。

我有一份清单。更具体地说是[[Char]]

我想定位列表中的特定元素,并查看元素上方,下方和左侧和右侧的元素。

例如:

["-------",
 "-------",
 "---N---",
 "--WOE--",
 "---S---",
 "-------",
 "-------"]

O是我定位的元素,N,S,E,W是直接围绕元素O的元素。

我创建的函数获取元素(x,y)的{​​{1}}坐标,如下所示:

O

find :: Eq a => [[a]] -> a -> (Int,Int) find [[]] _ = (-1,-1) find (x:xs) el = findHelper (x:xs) (0,0,el) findHelper :: Eq a => [[a]] -> (Int,Int,a) -> (Int,Int) findHelper [[]] _ = (-1,-1) findHelper (x:xs) (row,col,el) | x == [] = findHelper xs (row+1,0,el) | (head x) == el = (row,col) | otherwise = findHelper ((tail x) : xs) (row,col + 1,el) 坐标系为0索引。一旦我掌握了我正在寻找的元素的位置,我就不能为我的生活弄清楚,如何找出它周围的元素。

对不起,如果这不是最清楚的问题,如果我错过了什么,我可以详细说明。

1 个答案:

答案 0 :(得分:2)

您尝试做的并不总是可行,因为列表没有固定的大小。但是,如果可以确保这样做,则可能需要进行大量检查以防止出现问题。我将展示一种可以获取周围元素的方法,但是您必须构建一些额外的检查以确保它不会尝试查找超出范围的元素。

这可以为您提供包含周围元素的列表:

findSurrounding :: [[a]] -> (Int, Int) -> [a]
findSurrounding matrix (x,y) = map (getElementAt matrix) positions
    where positions = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

getElementAt :: [[a]] -> (Int, Int) -> a
getElementAt matrix (x, y) = (matrix !! y) !! x

我没有对代码进行测试,因此可能需要进行一些调整,但它应该让你开始。