8

私は clojure に関する本を読んでいて、完全には理解できない例を見つけました..

repl のコードは次のとおりです。

user=> (repeatedly 10 (rand-int 10))
ClassCastException java.lang.Integer cannot be cast to clojure.lang.IFn  clojure.core/repeatedly/fn--4705 (core.clj:4642)

user=> (repeatedly 10 (partial rand-int 10))
(5 0 5 5 2 4 8 8 0 0)

私の質問は、ここで が必要な理由と、それが定義、および定義と構文partialにどのように適合するかです。部分的 ...partialrepeatedly

Takes a function f and fewer than the normal arguments to f, and
  returns a fn that takes a variable number of additional args. When
  called, the returned function calls f with args + additional args.

では、これはどのように適合しますか?

4

3 に答える 3

10

部分的は、引数の一部を関数に固定し、残りを引数から作成された関数に渡す無名関数を定義する簡単な方法です。

この場合

user> (repeatedly 10 (partial rand-int 10))
(3 1 3 6 1 2 7 1 5 3)

次と同等です。

user> (repeatedly 10 #(rand-int 10))                        
(9 5 6 0 0 5 7 6 9 6)

ここでの Partial は、partialrand-int のすべての引数 (または 1 つだけ) を事前に修正するために使用されているため、誤称です。

部分的なより興味深い使用法は、その機能をよりよく示しています。

(partial + 4)

以下と同等のものを生成します。

(fn [& unfixed-args] (apply + (concat [4] unfixed-args)))

(文字通りこれを生成しません)固定されていない引数を取り、それらを固定されたものと組み合わせ、partial適切に機能するのに十分な引数で渡された関数を呼び出す関数を構築するという考えです。

user> ((fn [& unfixed-args] (apply + (concat [4] unfixed-args))) 5 6 7 8 9)       
39
user> ((partial + 4) 5 6 7 8 9)
39   

実際には、引数の数が可変の場合にのみ部分的に使用します。それ以外の場合は、無名関数のリーダー フォームを使用することを個人的に好みます#( ... )

于 2013-04-13T00:27:16.947 に答える
0

repeatedly関心のある署名:(repeatedly number function)

この場合、 partial はrand-int 10、返されて外側の関数 (この場合は ) によって使用される関数に単純にラップされますrepeatedly

without partial(or #)の内側の式は、外側の式の前に解決されます(例外はありますが、ここでは単純にしておきましょう) repeatedly。.partialrand-intInt

于 2019-01-15T08:34:00.300 に答える