2015-03-31 235 views
1

我在編寫從元組內的列表中刪除元素的函數時遇到問題。從元組列表中刪除元素

問題是,我想要函數返回元組。但是,使用Data.Listdelete函數給我一個列表。

代碼:

-- type Value = Int 
type Cell = (Int, [Int]) 
type Board = [Cell] 

----------- your solution goes here -------------- 


-- solvem :: Board -> Board 
-- solvem bd = ??? 
deleteCandidate :: Int -> Cell -> Cell 
deleteCandidate cand c1 = delete cand (snd c1) -- This gives me trouble 

updateNeighbors :: Cell -> Cell -> Cell 
updateNeighbors c1 c2 | isNeighbor c1 c2 = deleteCandidate (head (snd c1)) c2 
         | otherwise = c2 

由於Haskell中的數據是不可變的,我將如何在deleteCandidate函數返回一個元組?我需要重建一個Cell嗎?

回答

6

簡單的模式匹配的元組提取兩片,在其中一人操作,然後再將其重新組合成一個新的記錄:

deleteCandidate :: Int -> Cell -> Cell 
deleteCandidate cand (x, xs) = (x, delete cand xs) 

另外,由於(a,)Functor例如,您可以寫

deleteCandidate :: Int -> Cell -> Cell 
deleteCandidate cand = fmap (delete cand) 

或者,時間更短,你可以在的Elid明確cand參數以及和快速deleteCandidate作爲一個簡單的功能組成:

deleteCandidate :: Int -> Cell -> Cell 
deleteCandidate = fmap . delete 

就我個人而言,我最喜歡第二個版本,因爲我覺得很難考慮這個組合如何工作,以及它與(fmap delete)有什麼不同。