Ramda:记住并使用值

问题描述 投票:0回答:1

我正在尝试“ Ramdafy”一个函数并使它无指向。这是我走了多远:

const hasFetchedForFilterQueryString = state => {
  const filterQueryString = getFilterQueryString(state);
  return either(
    pipe(getPages, has(filterQueryString)),
    pipe(getNewlyLoadedUsers, has(filterQueryString)),
  )(state);
};

// or

const hasFetchedForFilterQueryString = state =>
  either(
    pipe(getPages, has(getFilterQueryString(state))),
    pipe(getNewlyLoadedUsers, has(getFilterQueryString(state))),
  )(state);

我想知道是否有一种方法可以编写更多的无点数,因此无需将filterQueryString保留在变量中,而必须手动应用state

javascript functional-programming ramda.js pointfree
1个回答
0
投票

我通常会对Bergi的评论满意。无分制本身不应成为目标。当我开始编写Ramda时,我被它迷住了,它中有许多旨在帮助使事情变得毫无意义的功能。我很少推荐他们了。我认为useWithuseWith都不会使函数更易于阅读或维护。

但是在FP世界中有一个已知的函数converge,在这里很有用。我认为converge是将函数从值的领域提升到这些值的containers领域。因此lift。当与产生我们的值的函数一起使用时,它可能像这样工作:

lift

而这正是您要对函数进行的操作。因此,这是一个基于lift的无点版本:

lift (add) (Maybe(3), Maybe(5)) //=> Maybe(8)

我发现这比以上任何一个版本都可读。

我认为该版本可与我为可读性提出的最简单的非Ramda版本相媲美:

lift ((a, b) => a + b) (
  n => n * 2, 
  n => n - 1
) (5) 
//=> (5 * 2) + (5 -1) //=> 14`.

不过不一定more可读。而且它的效率较低,因为(除了附加的函数调用之外)它将不得不两次调用lift。但这是一个可读且可维护的功能。

如果const hfffqs2 = either ( lift (has) (getFilterQueryString, getPages), lift (has) (getFilterQueryString, getNewlyLoadedUsers) ) 仍然不太清楚,则中间格式可能看起来像这样:

const hfffqs3 = state => {
  const query = getFilterQueryString(state);
  return query in getPages(state)
      || query in getNewlyLoadedUsers(state)
}

通过将getFilterQueryStringlift应用于const hfffqs1 = either ( state => has(getFilterQueryString(state), getPages(state)), state => has(getFilterQueryString(state), getNewlyLoadedUsers(state)) ) ,我们得到了getFilterQueryString的等效项,并且与下一行类似。我们已经将函数getState从字符串和对象的领域中[[提升]]到了返回字符串和对象的functions的领域中。我们可以将lift (has)传递给这两个函数以获取字符串和对象。


您可以在下面的代码段中看到这些内容:

state => has(getFilterQueryString(state), getPages(state))
has
state
© www.soinside.com 2019 - 2024. All rights reserved.