如何在函数式编程中映射 reduce 引用数据

How to map reduce referential data in functional programming

我想使用函数式编程制作一个基于图块的游戏。

游戏有6张牌,每张牌可以占一块。这是我的数据结构:

{
 :pieces {
          1 { :type 'p' }
          2 { :type 'r' }
          }
 :tiles [{}
         {}
         {:current 1}
         {}
         {:current 2}
         {}]
 }

这是游戏图块的序列表示:

'00p0r0'

我需要一个函数将这个串行数据转换成我的数据结构。

有多种方法可以对此进行优化,但它应该会给您正确的想法。请参阅下面的代码以获取替代建议。

这里有趣的是您将固定的图块模型映射到可变块类型集上。将piece模型做成固定数组也会有效率

注意: 输入必须是字符串,而不是像您的示例那样使用单引号:(例如 "00p0r0"'00p0r0').

(def empty-tile-map
  {:piece-count 0
   :pieces {}
   :tiles (into [] (repeat 6 {}))})

(defn set-tile
  "Sets the tile to the index reference to piece"
  [arref indx value]
  (assoc arref indx {:current value}))

(defn string-to-board-reducer
  "Reduce function to create pieces and reference in tile"
  [{:keys [piece-count tcount tiles] :as acc} x]
  (let [ccnt   (inc piece-count)
        nmap   (assoc acc :tcount (inc tcount))]
    (if (> (int x) 48)
      (assoc 
        (assoc
          (update-in nmap [:pieces] assoc ccnt {:type x})
          :tiles (set-tile tiles tcount ccnt))
        :piece-count ccnt)
      nmap)
    ))

(defn string-to-board
  [s]
  "Take serializated string and generate board"
  (dissoc (reduce string-to-board-reducer 
                  (assoc empty-tile-map :tcount 0) (seq s))
          :tcount))

候补 根据定义,输入字符串隐式包含您想要的所有信息。可以定义一系列函数,将序列化字符串用作棋盘状态,并随时用新字符串替换它。只是一个建议。