Составляющая функция с большей арностью в Рамде
Я с нетерпением пытаюсь изучить функциональное программирование в 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.