2017-02-15 59 views
1

我嘗試使用R.cond設置條件語句。首先,我根據輸入得到數組大小(即[1,2,3]),然後檢查數組大小是否大於/等於輸入大小(即3)。但是我收到了一條錯誤消息。我想知道爲什麼發生錯誤以及如何解決它,謝謝。Ramda:條件語句問題

R.cond([ 
    [R.compose(R.gte, R.length),() => {console.log(1)}], 
    [R.T,() => {console.log(2)}] 
])([1,2,3])(3) 

錯誤消息:R.cond(...)(...)不是一個函數

回答

1

我認爲這裏有兩個不同的問題。首先,因爲絕大多數對cond函數的調用都是一元的,所以不會影響結果。因此你不能稱之爲(...)([1,2,3])(3)。您將需要執行(...)([1,2,3], 3)

但這並不能解決其他問題。

compose(和它的孿生兄弟pipe)確實爲他們的第一次調用帶來了多個參數,但之後只有一個參數在它們之間傳遞。所以傳遞給gte的唯一值是length的結果。

你可以用幾種方法解決這個問題。也許最簡單的是:

const fn = R.cond([ 
    [(list, len) => list.length >= len, always(1)], 
    [R.T, always(2)] 
]); 

fn([1, 2], 3); //=> 2 
fn([1, 2, 3], 3); //=> 1 

(請注意,我改變了你console.log一個返回值的函數)

如果你想使這個自由點,你可以切換到使用Ramda的useWith像這樣的:

const fn = R.cond([ 
    [R.useWith(R.gte, [R.length, R.identity]), always(1)], 
    [R.T, always(2)] 
]); 

但經常發生,我認爲引進箭頭功能,使得工具,如useWith幫助較小。我發現早期版本更具可讀性。

您可以在Ramda REPL中看到這些行動。

+0

謝謝,非常有用。 – user2504831

+0

對不起,我想問你在Ramda REPL的例子。我們調用fn1([1,2],3),結果返回1.程序應該執行R.length([1,2])並得到結果2,然後執行R.gte(2),我是對的?如果是的話,R.gte(2)的結果是一個函數,爲什麼它返回1而不是2?謝謝。 – user2504831

+1

因爲'cond'檢查是否真的有問題。所以'gte(2)'是一個函數,它是真實的,我們返回第一個條件的結果。 (注意,例如'!!(function(){}); // => true'。) –