循环使用字典,同时使用不同的值来插入和删除键

时间:2017-01-04 01:44:12

标签: haskell dictionary recursion fold

我使用顶点和Data.Map.Strict,我需要为游戏Checkers实现捕获移动。 cMove应该采用顶点k和顶点列表ks以及地图myMapcMove需要检查新的顶点(k跳过ks顶点时myMap将获得的位置)是myMapk包含板上所有部件的位置。应从k1中移除ksmyMapmyMap中的顶点),并将新顶点插入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}}。我如何实现这一目标?

如果我的问题的任何部分看起来含糊不清,请不要犹豫,让我知道。

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)