1

すべての要素を通過して操作を適用するマップ関数を作成しようとしています。これは単純にmap関数に似ていますが、より深くなります。

この関数は 2 つの引数を取ります。1 つの関数と引数用の 1 つ。

これが私がこれまでに持っているものです:

(defn go-through
 [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply (partial map go-through op) args)))

そして、最後の行は、呼び出さなくても機能しないことを知っていました。しかし、私は他の方法を知りません。

提案?


おそらく、そのような機能の使用を制限しています。

サンプル:

user=> (go-through + 1 2)
3
user=> (go-through + [1 2] [3 4])
IllegalArgumentException Don't know how to create ISeq from: clojure.core$_PLUS_     clojure.lang.RT.seqFrom (RT.java:494)

私は期待していました[4 6]

アイデアは、シーケンシャルではなく、単一の要素で動作するすべての関数に適用できるということです。

4

2 に答える 2

2

これはあなたのための解決策かもしれません:

(defn go-through [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply map op args)))

(go-through + 1 2 3)
-> 6

(go-through + [1 2] [3 4] [5 6])
-> (9 12)

バージョン 2 (元の例を修正)

(defn go-through [op & args]
   (if-not (sequential? (first args))
     (apply op args)
     (apply map (partial go-through op) args)))

(go-through + [[1 2] [3 4]] [[5 6] [7 8]])
-> ((6 8) (10 12))
于 2012-12-13T01:00:15.233 に答える
0

「if」条件は最初の引数がシーケンシャルかどうかをチェックするだけであり、op を呼び出すとすべての引数が処理されるため、最初の行も機能しないことに注意してください。

http://richhickey.github.com/clojure/clojure.walk-api.htmlを使用するか、そのコードを確認することをお勧めします;)

于 2012-12-13T00:19:14.993 に答える