我使用顶点和Data.Map.Strict
,我需要为游戏Checkers实现捕获移动。 cMove
应该采用顶点k
和顶点列表ks
以及地图myMap
。 cMove
需要检查新的顶点(k
跳过ks
顶点时myMap
将获得的位置)是myMap
,k
包含板上所有部件的位置。应从k1
中移除ks
和myMap
(myMap
中的顶点),并将新顶点插入ks
,其中新顶点应为用于检查type Key = (Integer, Integer)
cMove :: Key -> [Key] -> Map Key Bool -> Map Key Bool
cMove k ks myMap = foldr cMoves' myMap ks
where
cMoves' :: Key -> Map Key Bool -> Map Key Bool
cMoves' k1 myMap = case M.lookup k' myMap of
Nothing -> M.insert k' False (M.delete k myMap)
Just x -> myMap
where
k' = (2 * fst k1 - fst k, 2 * snd k1 - snd k)
中的下一个顶点,依此类推,直到列表中没有更多元素。我试过这个:
k1
按预期迭代列表k1
并插入新顶点。这里的问题是,k
没有被移除,并且不使用新的顶点而不是{{1}}。我如何实现这一目标?
如果我的问题的任何部分看起来含糊不清,请不要犹豫,让我知道。
答案 0 :(得分:2)
如果我理解正确的问题,您希望将k
更改为k'
从迭代到迭代。您可以通过更改折叠的状态来包含k
:
cMove :: Key -> [Key] -> Map Key Bool -> Map Key Bool
cMove k ks myMap = snd $ foldr cMoves' (k, myMap) ks
where
cMoves' :: Key -> (Key, Map Key Bool) -> (Key, Map Key Bool)
cMoves' k1 (k, myMap) = case M.lookup k' myMap of
Nothing -> (k1, M.insert k' False . M.delete k . M.delete k1 $ myMap)
Just x -> (k, myMap)
where
k' = (2 * fst k1 - fst k, 2 * snd k1 - snd k)