拉姆达:重写自由风格

时间:2018-01-14 16:08:39

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

我使用以下函数将一些数据发送到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更具可读性和优先性,但我希望$string .= $sender_name."\r\n"; $string .= $sender_number."\r\n"; $string .= $sender_message."\r\n"; $body .= base64_encode(chunk_split($string)); // I think since your transfer encoding is base64, it will not respect the line endings added by the chunk_split not sure tho so be sure to encode it all with base64 函数位于无点的路径上相当于上面的代码,因此包含它们。

2 个答案:

答案 0 :(得分:2)

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

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的一些功能的方法。我不会投入生产。

答案 1 :(得分:2)

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

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

如果你按照反驳论点的顺序打电话给你,你就不需要flip上的filter