2017-02-02 5 views
0

私は関数のアプリケーション(出力への入出力)を表すハッシュマップを返すより高次のmap関数を持っています。したがって、使用する入力から出力へのハッシュマップにマップしますか?この機能は存在しますか?

(defn map-application [f coll] (into {} (map #(vector % (f %)) coll))) 

:この機能は、すでに

(map-application str [1 2 3 4 5]) 
{1 "1", 2 "2", 3 "3", 4 "4", 5 "5"} 

(map-application (partial * 10) [1 2 3 4 5]) 
{1 10, 2 20, 3 30, 4 40, 5 50} 

存在するか、またはこのパターンは、認識され名前がありますか?

私はそれが1本のライナーだと知っていますが、clojure.coreの関連機能の星座を見ると、これは既に存在するもののようです。

答えて

2

あなたが探している用語はtransducerだと思います。 https://clojure.org/reference/transducers

実際に変換変異体は、(重要な違いがcoll引数がinto機能しませmapに渡されるということです)、ほとんどあなたのようになりますが、それはそれは中間コレクションせずに仕事だん:

user> (defn into-map [f coll] 
     (into {} (map (juxt identity f)) coll)) 
#'user/into-map 
user> (into-map inc [1 2 3]) 
;;=> {1 2, 2 3, 3 4} 

それはもう少し手作業を必要とするものの、これは、単純な削減にもを行うことができます:あなたが記述している何

user> (defn map-into-2 [f coll] 
     (reduce #(assoc %1 %2 (f %2)) {} coll)) 
#'user/map-into-2 
user> (map-into-2 inc [1 2 3]) 
;;=> {1 2, 2 3, 3 4} 
+0

ありがとう! 'juxt'は、乱雑なベクトルのものよりもずっと良いです。また、トランスデューサを使用することも改善されています。しかし、私の質問はトップレベルの関数(本質的には '{{}'の部分ですが、 'into 'を使ったタプルseqではなくトランスデューサを使って別の使い方をしています)。 – Joe

2

はEASIです組み込みのzipmap関数で処理されます:

(defn map-application 
    [f coll] 
    (zipmap coll (map f coll))) 

(map-application (partial * 10) [1 2 3 4 5]) 
=> {1 10, 2 20, 3 30, 4 40, 5 50} 
+0

いいアイデアです、ありがとう。しかし、私の質問はトップレベルの機能に関するものでした。 – Joe

関連する問題