3

別の無名関数から省略表記を使用していない無名関数を呼び出したいです。

最後の評価が返されるため、次の操作は機能しません。

user> ((fn [x] (fn [y] (inc y)) x) 3)
3

ここで、外側の匿名関数から内側の匿名関数を呼び出す方法が必要です。

これを行うことでなんとか機能させることができましたが、複雑に見えます:

user> ((fn [x] (let [f (fn [y] (inc y))] (f x))) 3)
4     ;; good, 4 is the result I want here

匿名関数をネストする簡単な方法はありますか?

4

2 に答える 2

8

その最初の行を分割しましょう。

((fn [x]
   (fn [y] (inc y))  ; construct an anonymous function
   x)                ; return the outer parameter
 3)

内部関数は使用されないことに注意してください。

あなたがやりたいと思うこと:

((fn [x]
   ((fn [y] (inc y)) x))
 3)
于 2012-11-06T19:23:13.983 に答える
5

letコードの明瞭さを向上させるためにフォームを使用することを強くお勧めします。

(let [f (fn [y] (inc y))
      g (fn [x] (f x))]
  (g 3))

私は前者を受け入れる他の機能さえ持っています。

(let [f (fn [y] (inc y))
      g (fn [h x] (h x))]
  (g f 3))

または次のように:

(let [f (fn [y] (inc y))
      g (fn [h x] (h x))
      gf (partial g f)]
  (gf 3))

これにより、読み取りが容易になり、関数の理解がはるかに容易になります。それでもlet私はここで立ち止まって、別のより良い機能に取り組みません.

少し考えた後、引数が1つの関数を定義する必要はないと思いfますinc。また、リーダーの無名関数リテラルを使用すると、次のletような形式になる可能性があります。

(let [f inc
      g #(% %2)
      gf (partial g f)]
  (gf 3))

しかし、考えれば考えるほど、問題がわからなくなります。

あなたが本当に達成したいことを説明していただけますか?

于 2012-11-06T23:21:20.933 に答える