以无点方式使用 Ramda 地图助手

Using Ramda map helper in pointfree way

如何更改此代码:

 map(user => assoc('isAdult', isAdult(user), user)

实现 pointfree 功能(使用 Ramda)。我正在考虑如何使用 useWith 来实现,但找不到有效的实现。

有什么想法吗?

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 键扩展的 returns 对象数组的函数。如果用户超过 18 岁,我们将标志设置为 true.

此外,该函数应该 return 用户按标志 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 可能最有帮助。注意函数链是如何工作的:chain(f, g)(x) //=> f(g(x), x).

所以你可以把你的相关部分写成

map(chain(assoc('isAdult'), isAdult))

您可以在 Ramda REPL.

上看到实际效果