Ramda:记住并使用价值
Ramda: Remember and use value
我正在尝试 "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
or converge
通常会使函数更易于阅读或维护。
但是有一个功能,lift
,在 FP 世界中广为人知,在这里很有用。我认为 lift
是将函数从价值领域提升到 容器 这些价值的领域。因此 lift (add) (Maybe(3), Maybe(5)) //=> Maybe(8)
。当与产生我们的值的函数一起使用时,它可能会像这样工作:
lift ((a, b) => a + b) (
n => n * 2,
n => n - 1
) (5)
//=> (5 * 2) + (5 -1) //=> 14`.
而这正是您想对函数执行的操作。所以这里是一个lift
基础的免分版本:
const hfffqs2 = either (
lift (has) (getFilterQueryString, getPages),
lift (has) (getFilterQueryString, getNewlyLoadedUsers)
)
我发现这比你上面的任何一个版本都更具可读性。
我认为该版本可与我能想到的最简单的非 Ramda 版本相媲美,以提高可读性:
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
应用于 lift (has)
我们得到 state => has(getFilterQueryString(state), getPages(state))
的等价物,下一行也类似。我们已经提升函数has
从字符串和对象的领域到函数的领域,其中return字符串和对象。我们可以将state
传给这两个函数,得到一个字符串和一个对象。
您可以在以下代码段中看到这些操作:
// Dummy implementations just for demo. `state` is a small integer.
const getFilterQueryString = (state) => ['foo', 'bar', 'baz', 'qux', 'corge', 'grault'][state]
const getPages = (state) => [{foo: 1, bar: 2}, {foo: 1, corge: 2, grault: 3}, {baz: 1}, {foo: 1, grault: 2}, {corge: 1, baz: 2}, {bar: 1, qux: 2}][state]
const getNewlyLoadedUsers = (state) => [{baz: 1, qux: 2}, {corge: 1, grault: 2}, {foo: 1, corge: 2}, {baz: 1, qux: 2}, {foo: 1, qux: 2}, {bar: 1, corge: 2}][state]
const hasFetchedForFilterQueryString = state => {
const filterQueryString = getFilterQueryString(state);
return either(
pipe(getPages, has(filterQueryString)),
pipe(getNewlyLoadedUsers, has(filterQueryString)),
)(state);
};
console .log ([0, 1, 2, 3, 4, 5].map(hasFetchedForFilterQueryString))
const hfffqs1 = either (
state => has(getFilterQueryString(state), getPages(state)),
state => has(getFilterQueryString(state), getNewlyLoadedUsers(state))
)
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs1))
const hfffqs2 = either (
lift (has) (getFilterQueryString, getPages),
lift (has) (getFilterQueryString, getNewlyLoadedUsers)
)
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs2))
const hfffqs3 = state => {
const query = getFilterQueryString(state);
return query in getPages(state)
|| query in getNewlyLoadedUsers(state)
}
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs3))
.as-console-wrapper {min-height: 100% !important; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {either, pipe, has, lift} = R </script>
我正在尝试 "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
or converge
通常会使函数更易于阅读或维护。
但是有一个功能,lift
,在 FP 世界中广为人知,在这里很有用。我认为 lift
是将函数从价值领域提升到 容器 这些价值的领域。因此 lift (add) (Maybe(3), Maybe(5)) //=> Maybe(8)
。当与产生我们的值的函数一起使用时,它可能会像这样工作:
lift ((a, b) => a + b) (
n => n * 2,
n => n - 1
) (5)
//=> (5 * 2) + (5 -1) //=> 14`.
而这正是您想对函数执行的操作。所以这里是一个lift
基础的免分版本:
const hfffqs2 = either (
lift (has) (getFilterQueryString, getPages),
lift (has) (getFilterQueryString, getNewlyLoadedUsers)
)
我发现这比你上面的任何一个版本都更具可读性。
我认为该版本可与我能想到的最简单的非 Ramda 版本相媲美,以提高可读性:
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
应用于 lift (has)
我们得到 state => has(getFilterQueryString(state), getPages(state))
的等价物,下一行也类似。我们已经提升函数has
从字符串和对象的领域到函数的领域,其中return字符串和对象。我们可以将state
传给这两个函数,得到一个字符串和一个对象。
您可以在以下代码段中看到这些操作:
// Dummy implementations just for demo. `state` is a small integer.
const getFilterQueryString = (state) => ['foo', 'bar', 'baz', 'qux', 'corge', 'grault'][state]
const getPages = (state) => [{foo: 1, bar: 2}, {foo: 1, corge: 2, grault: 3}, {baz: 1}, {foo: 1, grault: 2}, {corge: 1, baz: 2}, {bar: 1, qux: 2}][state]
const getNewlyLoadedUsers = (state) => [{baz: 1, qux: 2}, {corge: 1, grault: 2}, {foo: 1, corge: 2}, {baz: 1, qux: 2}, {foo: 1, qux: 2}, {bar: 1, corge: 2}][state]
const hasFetchedForFilterQueryString = state => {
const filterQueryString = getFilterQueryString(state);
return either(
pipe(getPages, has(filterQueryString)),
pipe(getNewlyLoadedUsers, has(filterQueryString)),
)(state);
};
console .log ([0, 1, 2, 3, 4, 5].map(hasFetchedForFilterQueryString))
const hfffqs1 = either (
state => has(getFilterQueryString(state), getPages(state)),
state => has(getFilterQueryString(state), getNewlyLoadedUsers(state))
)
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs1))
const hfffqs2 = either (
lift (has) (getFilterQueryString, getPages),
lift (has) (getFilterQueryString, getNewlyLoadedUsers)
)
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs2))
const hfffqs3 = state => {
const query = getFilterQueryString(state);
return query in getPages(state)
|| query in getNewlyLoadedUsers(state)
}
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs3))
.as-console-wrapper {min-height: 100% !important; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {either, pipe, has, lift} = R </script>