2011-12-08 5 views
3

私は今日、私は、前のものの結果に基づいて、マップ内のエントリを漸進的に関連させたいと思ったことに出くわしました。ここに私がしたことがあります:Clojureのプログレッシブアソシエンス

(defn -Y [v k f] (assoc v k (f v))) 

(defn build-map [a-map] 
(-> a-map 
    (-Y :x #(reduce + (:values %)) ) 
    (-Y :y #(/ (:x %) 100)) 
    (-Y :z #(* (:y %) 10000000)) 
) 
) 
(build-map {:values (range 8)}) 

私はあなたの考えを歓迎します)それはいいですか? b)私が見たことがない既存の方法がありますか? (APIがうまくいきません)

答えて

7

マップにはいくつかの変換が行われ、最終的なマップになります。あなたの実装は、-Yが大したことをしていないことと、別の機能として必要でないことを除いて、私にとってはうまく見えます。

(def operations [ [:x #(reduce + (:values %))]  
        [:y #(/ (:x %) 100)]  
        [:z #(* (:y %) 10000000)]  
       ]) 

(defn build-map [a-map] 
    (reduce (fn [s [k f]] (assoc s k (f s))) a-map operations) 
    ) 

(build-map {:values (range 8)}) 
+0

私は物事を作るために... –

10

私ははAnkurによって答えはあなたのオリジナルデザインの良い改善だと思う:

は、あなただけのreduce機能、のようなものを使用して、すべてこれを行うことができます。

私は、物事を過度に複雑にする必要は必ずしもないと言いたいと思います。あなたはとにかく同じ機能ですべての追加マップエントリを計算する場合は、この単純なアプローチは、私の意見では、はるかに読みやすいです:

(defn build-map [a-map] 
    (let [x (reduce + (:values a-map)) 
     y (/ x 100) 
     z (* y 10000000)] 
    (merge a-map {:x x :y y :z z}))) 
+1

+1同じコードを投稿するちょうど約ましたよりシンプルに – Ankur

+0

hehe - my -Y関数は効果的にレットでした!これは間違いなくシンプルですが、どういうわけか私にクリープを与えることができます(理由はわかりません)。それが明らかに問題を避ける理由です。私は、これらのプログレッシブ・オペレーションの状況を表現するより良い方法があると感じていますが、私はClojureを学び始めているだけです。 – Hendekagon