1

我使用以下函数通过将一些数据包装在高阶组件中来将一些数据发送到 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 重写这段代码,这样ownPropsgetChapter可以被淘汰了,如果只是作为一个学术练习的话。

ownProps由于参数的顺序,我似乎应该首先消除?虽然我什至不确定。

任何帮助将不胜感激!

PS。我知道在上面的代码中,在其他条件不变的ownProps.section情况下,上面的代码更具可读性和更可取prop('section', ownProps),但我希望该prop函数位于通向上面代码的无点等效项的路径上,因此包含它们。

4

2 回答 2

3

这可以做到吗当然。这是一个版本:

const example2 = useWith(flip(filter), [prop('getContents'), pipe(
  prop('section'),
  equals,
  objOf('sectionId'),
  where,
  both(where({
    subsectionId: isNil,
    sub2sectionId: isNil,
    sub3sectionId: isNil
  }))
)])

其中最不寻常的函数是 Ramda's useWith,其行为类似于useWith(f, [g, h])(x, y) ~> f(g(x, y), h(x, y))。这不是一种标准的函数式语言结构,只是一种有助于使一些难以做到的功能变得无点的结构。不过,在 ES6/ES2015 普及之前,它主要是有用的。

您可以在Ramda REPL上看到这一点。


你应该这样做吗?好吧,你说这是一项学术活动,也许吧。但我发现这比原来的可读性要差得多。在我看来,这只是作为学习 Ramda 某些功能的一种方式有用。我不会把它投入生产。

于 2018-01-15T01:41:34.167 回答
3

除了斯科特的回答,这是另一种可能的变体:

useWith(
  flip(filter),
  [
    prop('getContents'),
    pipe(
      prop('section'),
      equals,
      assoc('sectionId', R.__, {
        subsectionId: isNil,
        sub2sectionId: isNil,
        sub3sectionId: isNil
      }),
      where
    )
  ])

flip如果你用颠倒的参数顺序调用它,你就不需要filter.

于 2018-01-15T05:12:51.360 回答