Я думаю, что вы работаете с небольшим заблуждением. cond
разработан, чтобы дать вам функцию. Он действительно не предназначен для создания скалярного значения для выражения. Конечно, это можно сделать, просто вызвав вызываемую функцию. Но это не главное. Более того, он действительно не предназначен для вызова с нулевыми функциями (за исключением случая передачи T
для условия по умолчанию). Опять же, вы можете сделать это, но это работает против структуры инструмента.
Хотя Рамда черпает вдохновение из функциональных языков как в стиле LISP, так и в стиле ML, и хотя я лично больше поклонник первого, Рамда ближе к миру ML, особенно к Haskell. Таким образом, основное действие, которое он должен поддерживать, - это создание функций путем составления других функций.
Если бы я решил эту проблему, я бы не стал использовать Рамду вообще, выбрав что-то вроде этого:
const larger = (a, b) => (a > b) ? a : (b > a) ? b : -1
const foo = (a, b) => (a + 1) * larger(a, b)
foo(3, 4) //=> 16
foo(6, 3) //=> 42
foo(3, 3) //=> -4
Или, если мне не нужно повторно использовать larger
, я мог бы вставить это так:
const foo = (a, b) => (a + 1) * ((a > b) ? a : (b > a) ? b : -1)
Конечно, я могу написать это в «Рамде» и бессмысленно:
const larger = cond([[gt, unapply(head)], [lt, unapply(last)], [T, always(-1)]])
const foo = converge(multiply, [inc, larger])
Или снова я мог бы вставить larger
или заменить unapply(head)
на nthArg(0)
и unapply(last)
на nthArg(1)
.
Но ни одна из этих опций не так удобна для чтения, как оригинал. Рамда ничего не добавляет здесь, что я вижу. Обратите внимание, что я большой поклонник Рамды; Я основал библиотеку и являюсь одним из ее основных авторов. Но я не думаю, что это следует использовать для каждой проблемы.