(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答えは: ((0 1 2 3) (2 3))
誰かが何が起こっているのか説明してもらえますか? このコードを解読できませんか?!
ありがとう!
(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答えは: ((0 1 2 3) (2 3))
誰かが何が起こっているのか説明してもらえますか? このコードを解読できませんか?!
ありがとう!
Clojuremap
は、関数オペランドの後に複数の seq を使用でき、各 seq に対して 1 つの要素を圧縮します。最初の seq が使い果たされると、マップは終了します。
あなたのフォームでは、map
2 つの 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 引数を受け入れる必要があります。
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)