Javascript 以无点方式使用Ramda映射帮助器
如何更改此代码:Javascript 以无点方式使用Ramda映射帮助器,javascript,functional-programming,ramda.js,pointfree,Javascript,Functional Programming,Ramda.js,Pointfree,如何更改此代码: map(user => assoc('isAdult', isAdult(user), user) 要实现无点功能(使用Ramda)。我在考虑如何使用它,但找不到有效的实现 有什么想法吗 import { pipe, prop, gte, __, map, assoc, sortWith, descend } from 'ramda' const isAdult = pipe( prop('age'), gte(__, 18) ) const func =
map(user => assoc('isAdult', isAdult(user), user)
要实现无点功能(使用Ramda)。我在考虑如何使用它,但找不到有效的实现
有什么想法吗
import { pipe, prop, gte, __, map, assoc, sortWith, descend } from 'ramda'
const isAdult = pipe(
prop('age'),
gte(__, 18)
)
const func = pipe(
map(user => assoc('isAdult', isAdult(user), user)),
sortWith([
descend(prop('isAdult')),
descend(prop('age')),
])
)
export default func
编辑(更多信息):
我想创建一个函数,返回由isAdult
键扩展的对象数组。如果用户超过18岁,我们将标志设置为true
此外,该函数应返回按标志isAdult
排序的用户,然后按键age
排序的用户
样本数据:
const data1 = [
{
name: 'Cassidy David',
email: 'sit@Nullaeuneque.co.uk',
id: 'FC92BF1E-A6FD-E5C1-88AB-183BD1BC59C5',
position: 1,
age: 53,
created_at: '2017-04-07'
},
{
name: 'Gwendolyn Edwards',
email: 'ut.mi.Duis@elementumsemvitae.net',
id: '00000001-ED9D-3A88-0D3C-07A148FD43ED',
position: 2,
age: 10,
created_at: '2016-05-21'
},
好吧,我得到了一个解决方案,尽管这是否比您已经拥有的更清晰,这是一个相当有争议的问题:
const newFields = map(pipe(isAdult, objOf('isAdult')))(data1)
zipWith(merge, data1, newFields)
所以我要做一个额外的步骤,生成一个列表,其中的对象只有一个新的键,并将它们合并在一起,然后合并这些列表
我无法得到一个解决方案,在不避免箭头函数的情况下进行一次传递
编辑:斯科特·索耶(Scott Sauyet)的解决方案很好地解决了这个问题,实际上我认为试图让这一点自由化是否有用值得商榷 这是相当可读的,因为:
map(user => assoc('isAdult', isAdult(user), user)),
无点是一种伟大的技术,有时可以提高可读性。但如果没有,我也不会为此烦恼
这就是说,如果你真的想尝试点免费,可能是最有帮助的。注意链是如何为函数工作的:chain(f,g)(x)/=>f(g(x),x)
所以你可以把你的相关部分写成
map(chain(assoc('isAdult'), isAdult))
你可以在上看到这一点。你能用一个例子或其他东西再解释一下你想要达到的结果吗?代码中不清楚您期望的是什么output@MarioF当然,我刚刚更新了我的问题。很酷的解决方案!文档使得很难理解
chain
是否只做了他的工作,第二个例子应该可以说明这一点。但如果不是这样的话,将函数看作链,在当前的chainm=>(a->mb)->ma->mb
签名中,我们可以将r
到某物的函数看作我们的链,并将所有mx
替换为(r->x)
给予(a->(r->b)->(r->a)->(r->b)
,关联性会将其转换为(a->r->b)->(r->a)->(r->b)
。因此,对于x::r
和g::x->a
我们得到f::a->r->b
,而链只能满足于链(f,g)=x->f(g,x).
非常感谢@ScottSauyet!@ScottSauyet这是一个很好的读卡器monad应用程序。您切换chain
的参数有什么特别的原因吗?通常我喜欢编写chain(unaryF)(x=>chain(unaryF)(y=>of(…)
@ftor:不太清楚你在问什么。也许和相关。