4
(map drop '(0 1) '((0 1 2 3) (1 2 3)))

答えは: ((0 1 2 3) (2 3))

誰かが何が起こっているのか説明してもらえますか? このコードを解読できませんか?!

ありがとう!

4

2 に答える 2

9

Clojuremapは、関数オペランドの後に複数の seq を使用でき、各 seq に対して 1 つの要素を圧縮します。最初の seq が使い果たされると、マップは終了します。

あなたのフォームでは、map2 つの seqs:'(0 1)を指定'((0 1 2 3) (1 2 3))します。どちらも 2 つの要素を持ちます。したがって、コードは 2 つのdrop呼び出しを記述します。

(drop 0 '(0 1 2 3)) ; => '(0 1 2 3)
(drop 1 '(1 2 3))   ; => '(2 3)

このドキュメントがこれを解決するのに役立つことを願っています(強調は私のものです):

clojure.core/map ([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])

各 coll の最初の項目のセットに f を適用し、続いて各 collの 2 番目の項目のセットにf を適用した結果から構成される遅延シーケンスを、いずれかの coll がなくなるまで返します。他の coll 内の残りのアイテムは無視されます。関数
f は、number-of-colls 引数を受け入れる必要があります。

于 2013-04-30T09:21:25.820 に答える
2

Clojure のmap関数は非常に柔軟な関数であることに注意してください。他の言語で異なる関数が必要な場合に、いくつかのことを実行できます。

たとえば、次の 3 つの Haskell 関数でできることをすべて実行します。

map :: (a -> b) -> [a] -> [b]
zip :: [a] -> [b] -> [(a, b)]
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

どこ

zip = zipWith (,)

したがって、clojure では、次mapの 2 つの異なることを行います。

a) シーケンスを要素単位で同じ長さのシーケンスに変換します。これは、Haskell やその他の言語で「マップ」と呼ばれるものです。

b) 2 つ以上のシーケンスを 1 つの要素ごとにまとめて圧縮し、最短の入力シーケンスと同じ長さのシーケンスを提供します。これは、Haskell では「zipWith」と呼ばれます。

指定された関数は、入力シーケンスと同じ数のパラメーターを受け入れる必要があり、出力シーケンスに入る要素を返します。

あなたが与えたコードはmap、2番目の関数で使用しています。から要素とから0要素を削除します。結果は、結果シーケンスに入ります。(0 1 2 3)1(1 2 3)(0 1 2 3)(2 3)

于 2013-04-30T12:33:21.460 に答える