从元组列表中删除元素
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)
有何不同。
我在编写从元组列表中删除元素的函数时遇到问题。
问题是,我想要 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)
有何不同。