私は頂点とData.Map.Strict
を使用しています。チェッカのゲームのキャプチャ移動を実装する必要があります。 cMove
は、頂点のリストk
と頂点のリストks
とマップmyMap
を取ると仮定されています。 cMove
は、新しい頂点(ks
の頂点を越えてジャンプするときに得るk
の位置)がmyMap
にあるので、myMap
にはボード上のすべての部分の位置が含まれているかどうかをチェックする必要があります。 k
と(ks
における頂点)がmyMap
から除去されるべきであり、新たな頂点が新しい頂点にはそれ以上の要素が存在しなくなるまで、そうでks
で次の頂点を確認するために使用されるべきmyMap
に挿入されなければなりませんリスト。想定され、新しい頂点を挿入して、リストを通じて異なる値を使用してキーを挿入したり削除したりしながら辞書をループする
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)
た反復する:私はこれを試してみました。ここでの問題は、が削除されず、k
の代わりに新しい頂点が使用されないことです。これをどのように達成するのですか?
私の質問のいずれかがあいまいであると思われる場合は、私に知らせてください。
それはちょうどあなたの質問のタイプミスかもしれませんが、あなたは 'cMove」に' k1'(タプル引数を混乱されるように表示されます。あなたにも
k
を含めるように折り畳みの状態を変化させることにより、それを行うことができます')と' ks'( 'cMove'へのリスト引数)です。また、 's'と' myMap'は同じ値になっていますか? – chepnerそれはタイプミスでした。気づいてくれてありがとう。はい、sとmyMapは同じ値になっています。混乱を避けるために質問を編集しました。 –
あなたは 'M.delete k1 'ではなく' M.delete k'を呼び出しています。 – chepner