Я думаю, что есть два отдельных вопроса здесь. Прежде всего, потому что подавляющее большинство звонков в 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.
Спасибо, очень полезно. – user2504831
Извините, я хочу больше узнать о вашем примере в Ramda REPL. Мы вызываем fn1 ([1, 2], 3) и возвращаем результат 1. Программа должна выполнить R.length ([1,2]) и получить результат 2, затем выполнить R.gte (2), am i right ? Если да, результат R.gte (2) является функцией, почему он возвращает 1 вместо 2? Благодарю. – user2504831
Потому что 'cond' проверяет, действительно ли что-то правдоподобно. Итак, 'gte (2)' является функцией, и это правда, мы возвращаем следствие первого условия. (Обратите внимание, например, что '!! (function() {}); // => true'.) –