2012-11-06 206 views
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 

有嵌套匿名函數更簡單的方法?

回答

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) 
+0

ooooh gotcha。通過在列表中包裝*(fn ...)x *,我將返回評估結果,而不是返回外部參數。爲什麼哦爲什麼我沒有想到這一點!它看起來不多,但你的回答實際上幫助我很多!感謝:) –

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,我也不會停留在這裏,並在另一個更好的功能上工作。

經過一番思考,我認爲沒有必要定義一個單參數函數finc這樣做。也有人可能會使用the reader's anonymous function literal得意忘形和let形式變爲:

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

但我認爲它的越少,我理解這個問題。

你能描述一下你真正想達到的目標嗎?

+1

我想達到的是更好地理解語言是如何工作的; ) –

+0

希望你做了我的答案。 –