从元组列表中删除元素

Deleting element from a tuple's list

我在编写从元组列表中删除元素的函数时遇到问题。

问题是,我想要 return 元组的函数。但是,使用 Data.List 中的 delete 函数给了我一个列表。

代码:

-- 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 中的数据是不可变的,我如何 return deleteCandidate 函数中的元组?我必须重建一个细胞吗?

简单地对元组进行模式匹配以提取两个部分,对其中一个进行操作,然后将其重新组合成一个新的元组:

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

或者,由于 (a,) 有一个 Functor 实例,您可以编写

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

或者,更简短地说,您也可以省略显式 cand 参数,并将 deleteCandidate 表示为一个简单的函数组合:

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

我个人最喜欢第二个版本,因为我很难思考这个构图是如何工作的,以及它与 (fmap delete) 有何不同。