我正在尝试“ 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
?
我通常会对Bergi的评论满意。无分制本身不应成为目标。当我开始编写Ramda时,我被它迷住了,它中有许多旨在帮助使事情变得毫无意义的功能。我很少推荐他们了。我认为useWith
或useWith
都不会使函数更易于阅读或维护。
但是在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)
}
通过将getFilterQueryString
和lift
应用于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