【问题标题】:Ramda: rewriting to point free styleRamda:重写为无点样式
【发布时间】:2018-06-23 09:44:08
【问题描述】:

我使用以下函数通过将一些数据包装在高阶组件中来将一些数据发送到 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 函数位于与上面代码等效的无点路径上,因此它们被包含在内。

【问题讨论】:

  • 无点样式不会增加可重用性。 x => f (x) 和无点 f 是等价的,但用不同的 style 表示。一个并不比另一个“更可重用”。
  • 感谢您的澄清,我更新了问题。
  • 我认为它看起来很糟糕,并且与最佳实践相去甚远,使其完全无点。它必须涉及许多步骤。一个步骤是使用 R.assoccreate 发送到 where 的对象。
  • 因为函数不可交换是什么意思?如果你的意思是不能改变example = getChapter => ownProps => ...中getChapter和ownProps的顺序,我认为是不正确的。我不明白你为什么不能把它改成example = ownProps => getChapter => ...
  • 哎呀,我的错,你是对的!

标签: javascript functional-programming ramda.js pointfree tacit-programming


【解决方案1】:

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

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

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

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


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

【讨论】:

    【解决方案2】:

    除了 Scott 的回答之外,这是另一种可能的变体:

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

    如果您以颠倒的参数顺序调用它,则不需要filter 上的flip

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2017-02-22
      • 2023-03-31
      • 2018-06-16
      • 2016-07-11
      • 2023-03-09
      相关资源
      最近更新 更多