4

私はclojureで遊んでいて、mapcatとlistを組み合わせてこの動作をエミュレートする高階関数を作成することにしました。

Clojure> (mapcat list '(1 2 3 4) '(5 6 7 8))
(1 5 2 6 3 7 4 8)

私の最初の試みは、mapcatListを次のように定義することでした。

Clojure> (defn mapcatList[& more](mapcat list more))
#'sandbox99/mapcatList
Clojure> (mapcatList '(1 2 3 4) '(5 6 7 8))
((1 2 3 4) (5 6 7 8))

明らかに、関数は私が望むように動作しません。これは、2つのリストが1つのリストに入れられ、2つではなく1つの引数として渡されるためだと思います。私は次のようにして状況を改善することができました、

Clojure> (defn mapcatList[x y & more](mapcat list x y))
#'sandbox99/mapcatList
Clojure> (mapcatList '(1 2 3 4) '(5 6 7 8))
(1 5 2 6 3 7 4 8)

このソリューションは2つのリストでうまく機能しますが、関数が可変数の引数で機能するようにしたいと思います。

私の質問:可変数の引数を関数に渡してから、それらを分解して、個々の引数として一緒に「mapcatリスト」に渡されるようにするにはどうすればよいですか?

4

2 に答える 2

14

あなたが探しているapply。これは、引数が順番に指定された関数を呼び出します。

しかし、あなたはあなたがやろうとしてinterleaveいることを正確に行う機能があることを知っていますか?mapcatList

于 2011-12-15T16:30:31.527 に答える
5

そうです、vararg宣言の結果として、引数はリストにラップされます。apply引数のリストをアンラップするには、引数を指定する必要があります。

(defn mapcatList[& more]
  (apply mapcat list more))

user=> (mapcatList '(1 2 3 4) '(5 6 7 8))               
(1 5 2 6 3 7 4 8)
user=> (mapcatList '(1 2 3 4) '(5 6 7 8) '(\a \b \c \d))
(1 5 \a 2 6 \b 3 7 \c 4 8 \d)
于 2011-12-15T16:26:41.493 に答える