我急切地想要学习js中的函数式编程,但是我很难过。我觉得我经常做这样的事情,这根本感觉不对:
export const getParamFromUrl = R.curry((name, url) => R.compose(
R.match(new RegExp(`[?&]${name}=([^&]*)`))
)(url));
我不觉得我应该立即调用compose。那么,用两个算法进行函数合成的正确方法是什么?
编辑:为了清楚起见,这是它看起来的实际功能(我知道这不是获取查询字符串的最佳方式)
/* 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)
));
答案 0 :(得分: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)
));
请注意,for technical reasons,compose
的结果不会自动计算,因此您需要自己做。
您可以在 Ramda REPL 上看到这一点。