4

2つの引数を必要とし、引数の順序が結果に影響する関数があるとします。

次のように、最初の引数を部分関数またはcomp関数とそれ以外の関数に渡すことは可能ですか?

(defn bar [arg1 arg2] (- arg1 arg2))
(def baz (partial (bar arg1)))
(def qux (comp str (bar arg1)))

(baz arg2)
(qux arg2)

arg2を関数に渡したい場合、このようなことを行うことができますか?

(def baz2 (partial (bar _ arg2)))
(def qux2 (comp str (bar _ arg2)))

(baz arg1)
(qux arg1)
4

3 に答える 3

9

partial左側の引数のみを「埋める」ので、引数をスキップする必要がある場合は、次を使用する必要がありますfn

(def baz2 #(bar %1 arg2))

compまた、すべての引数が関数である必要があるため、quxqux2は実際にはナンセンスであることに注意してください。彼らはする必要があります:

(def qux (comp str baz))
(def qux2 (comp str baz2))

一般に、Clojureのコア関数は、最後に変更される可能性が最も高い変数を配置して、構成をcompよりpartial自然なものにします。into(たとえば、コレクションの引数は、最初に配置するのが理にかなっている場合を除いて、ほとんどの場合Clojureの最後になります。)独自の関数を設計するときは、関数をより簡単に構成できるように、この規則に従う必要があります。

于 2013-02-28T16:49:02.543 に答える
4

スキームSRFI26cutには、このようなパラメーターをスロットするための便利なマクロがあります。

あなたの減算のための使用法はそうなるでしょうbar

 ((cut bar <> 1) 2)
 ;=> 1
 ((comp str (cut - <> 1)) 2)
 ;=> "1"

記号<>は、埋められるスロットを表します。

cut自分でClojureに実装するのは楽しい演習ですが、ここに@BaishampayanGhoseによる1つのポートがあります。

于 2013-02-28T17:31:54.330 に答える
2

これが私がreplで得たものです:

user=> (defn bar [arg1 arg2] (- arg1 arg2))
#'user/bar
user=> (def baz (partial bar 5))
#'user/baz
user=> (def qux (comp str baz))
#'user/qux
user=> (baz 2)
3
user=> (qux 2)
"3"

それは私があなたの最初の例から得ることができる最も近いものです。

2番目の例では、部分的なdefよりも単純なdefnの方が優れている可能性があります。

user=> (defn baz2 [x] (bar x 5))
#'user/baz2
user=> (def qux2 (comp str baz2))
#'user/qux2
user=> (baz2 2)
-3
user=> (qux2 2)
"-3"

replを開始して自分で試してみることをお勧めします。これは、私が知っている言語を見つけるための2番目に良い方法です(TDDが最初です)。

乾杯!

于 2013-02-28T16:13:54.497 に答える