2017-02-15 8 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), am i right ? Если да, результат R.gte (2) является функцией, почему он возвращает 1 вместо 2? Благодарю. – user2504831

+1

Потому что 'cond' проверяет, действительно ли что-то правдоподобно. Итак, 'gte (2)' является функцией, и это правда, мы возвращаем следствие первого условия. (Обратите внимание, например, что '!! (function() {}); // => true'.) –

 Смежные вопросы

  • Нет связанных вопросов^_^