2017-06-12 77 views
2

我剛剛觀察到這種行爲與拉姆達功能,並不能完全理解它。對於下列二元函數拉姆達函數給出空參數會發生什麼?

const t1 = (a) => R.cond([ [R.T, R.identity] ]); 

當兩個參數被給予,例如,

t1(1)({}) 

它作爲預期返回{}

但是,如果把這種方式

t1(1)() 

它返回一個[Function: f1]

究竟是在這裏做什麼?第二個參數是默認的東西,還是被當作從未提供?

在Ramda中有沒有明確設置第二個參數的默認值(例如{})?

+1

@cubrr謝謝,只是修正了錯字 – tinlyx

回答

2

嗯,首先,我不明白你的功能。 R.cond([ [R.T, R.identity] ])是寫一些本質上是身份函數的一種有點奇怪的方式。 cond通常需要多個謂語動作對,通常使用謂詞R.T最後一個作爲默認(類似於default情況下switch聲明。)

(a) => R.cond([ [R.T, R.identity] ])結束語這件事只是給你一個功能,您通過你喜歡的任何參數,這些參數被及時忽略,從而回饋那個奇怪的身份函數。

像由Ramda創造了許多功能,的cond輸出是令行禁止功能,採用Ramda的擴大鑽營的概念,在其中您可以調用的函數以不同的方式。例如,如果g = curry(function f(a, b, c) {/* ... */}),那麼所有的這些都相當於f(a, b, c)

g(a, b, c) 
g(a, b)(c) 
g(a)(b, c) 
g(a)(b)(c) 

如果你比參數的全套少打電話,你回來的另一個功能:

g(a); //~> curry((b, c) => f(a, b, c)) 
g(a, b); //~> curry((c) => f(a, b, c)) 

這擴展甚至根本沒有提供任何參數:

g(); //~> curry((a, b, c) => f(a, b, c)), 

這最後是你注意到的。 t1(1)返回奇數標識,R.cond([ [R.T, R.identity] ])。因爲這個函數是curried的,所以如果你沒有參數調用它,你會得到一些等同於同一個身份函數的東西。

這應該解釋爲什麼函數的行爲與它一樣。我不知道你想解決什麼根本問題,所以我不知道如何幫助...

除了你提到的違約,並可能拉姆達的defaultTo可能有所幫助。