2013-11-09 67 views
0

好吧,我是Haskell的新手,需要幫助我解決問題的功能方法。Haskell列表中的列表中的目標元素

我有一個列表。更具體地說是[[Char]]

我想定位列表中的特定元素,並查看元素上方,下方以及元素左側和右側的元素。

例如:

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

哪裏O是我靶向元件,和N,S,E,W直接包圍該元件O的元素。

我提出,獲得了所述元素O(x,y)座標的函數,並且它是如下:

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) 

(x,y)座標系是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 

我沒有測試的代碼,所以可能需要一些調整,但它應該讓你開始。

+0

這正是我所期待的。是的,我可以保證每個列表都有固定的大小,所以這不是問題。謝謝! – Nuuou