Составляющая функция с большей арностью в Рамде

Я с нетерпением пытаюсь изучить функциональное программирование в js, но мне трудно. Я чувствую, что постоянно делаю что-то вроде этого, а это совсем не так:

export const getParamFromUrl = R.curry((name, url) => R.compose(
    R.match(new RegExp(`[?&]${name}=([^&]*)`))
)(url));

Я не чувствую, что должен призывать сочинять безотлагательно. Итак, как правильно сделать композицию функций, используя, скажем, два?

РЕДАКТИРОВАТЬ: для ясности это фактическая функция, как она выглядит (и я знаю, что это не лучший способ получить строки запроса)

/* util.toMaybe takes a function and a value and returns Nothing()
   if the function returns true and Just(value) if it returns false.
   I think this is the HM:
   util.toMaybe :: (a -> Boolean) -> a -> Maybe a
*/
export const getParamFromUrl = R.curry((name, url) => R.compose(
    R.chain(util.toMaybe(R.isEmpty)),
    R.map(R.nth(1)),
    util.toMaybe(R.isEmpty),
    R.match(new RegExp(`[?&]${name}=([^&]*)`))
)(url));

При принятом ответе это станет:

export const getParamFromUrl = R.curry(R.compose(
    R.chain(util.toMaybe(R.isEmpty)),
    R.map(R.nth(1)),
    util.toMaybe(R.isEmpty),
    (name, url) => R.match(new RegExp(`[?&]${name}=([^&]*)`), url)
));

1 ответ

Решение

Не совсем понятно, что вы собираетесь делать с этим compose вызов. Функция будет работать одинаково хорошо без нее, и это более понятно.

const getParamFromUrl = R.curry((name, url) => 
    R.match(new RegExp(`[?&]${name}=([^&]*)`), url));

Если вы планируете добавить еще одну функцию в композицию, вы можете сделать это следующим образом:

const getParamFromUrl = R.curry(R.compose(
    nth(1),
    (name, url) => R.match(new RegExp(`[?&]${name}=([^&]*)`), url)
));

Обратите внимание, что по техническим причинам результат compose не является авто-карри, так что вам нужно сделать это самостоятельно.

Вы можете увидеть это в действии на Ramda REPL.

Другие вопросы по тегам