我使用以下函数通过将一些数据包装在高阶组件中来将一些数据发送到 React 组件:
import { equals, filter, isNil, prop, where } from 'ramda'
const example = getChapter => ownProps =>
filter(
where({
sectionId: equals(prop('section', ownProps)),
subsectionId: isNil,
sub2sectionId: isNil,
sub3sectionId: isNil
}),
prop('getContents', getChapter)
)
我熟悉函数式编程的概念,但对Ramda库来说仍然相对较新。现在我想使用 Ramda 重写这段代码,以便消除ownProps
和getChapter
,即使只是作为学术练习。
似乎我应该先消除ownProps
因为论点的顺序?虽然我什至不确定。
任何帮助将不胜感激!
附言。我知道在上面的代码中,ownProps.section
会更具可读性并且更喜欢 prop('section', ownProps)
,ceteri paribus,但我希望 prop
函数位于通往上述代码的无点等价物的路径上,因此它们包含在内。
这能做到吗? 确定。 这是一个版本:
const example2 = useWith(flip(filter), [prop('getContents'), pipe(
prop('section'),
equals,
objOf('sectionId'),
where,
both(where({
subsectionId: isNil,
sub2sectionId: isNil,
sub3sectionId: isNil
}))
)])
其中最不寻常的功能是拉姆达useWith
,它的作用与useWith(f, [g, h])(x, y) ~> f(g(x, y), h(x, y))
大致相似。 这不是一个标准的函数式语言结构,只是一个帮助使一些难以做到的函数无点的构造。 不过,在ES6/ES2015变得无处不在之前,它最有用。
你可以在Ramda REPL上看到这一点。
你应该这样做吗? 好吧,你说这是一个学术练习,所以也许。 但我发现这比原版的可读性差得多。 在我看来,这仅作为学习Ramda某些功能的一种方式有用。 我不会把它投入生产。
除了斯科特的回答之外,这是另一个可能的变体:
useWith(
flip(filter),
[
prop('getContents'),
pipe(
prop('section'),
equals,
assoc('sectionId', R.__, {
subsectionId: isNil,
sub2sectionId: isNil,
sub3sectionId: isNil
}),
where
)
])
而且,如果您以颠倒的参数顺序调用它,则不需要filter
上的flip
。