函数式编程 - 函数式 javascript - 柯里化和部分实现

functional programming - functional javascript - currying and partial implementation

我是函数式编程的新手,我正在研究 javascript 中的柯里化和部分实现的想法,以全面了解它们。目前,我正在尝试锻炼如何传递过滤功能。 下面是我在教程中看到的一行

var seperate = arr => key => val => arr.filter(obj => obj[key] === val);

说我想让过滤器函数成为柯里化参数,这样我就可以创建应用不同 filter 函数的部分实现,例如 var isHumanvar isLessThan50 等。
也许我可能想将其工作的数据集作为部分实现的一个参数传递,所以 var filterMembers(membershipData); 然后我想制作不同的过滤实现 var femaleMembers = filterMembers(isFemaleFilter);,这将是一个 array.filter() 函数。

如何实现这一目标?


编辑:

我的问题不是很清楚,抱歉。我希望数组和过滤器是可变的。我想从部分实现中组合单独的函数。

所以我可能会创建一个适用于成员数组的部分实现或另一个适用于人口普查数据或其他东西的实现。然后,我想将那些将不同过滤函数传递给在不同数据集上工作的部分实现的部分实现组合成函数。

恐怕我不知道如何编写演示我的问题的工作代码。

您需要过滤函数的部分实现:

const filter = fn => arr =>
    arr.filter(fn)

const members = [
  {name: 'eminem', sex: 'male'},
  {name: 'rihanna', sex: 'female'}
]

const filter = fn => arr =>
  arr.filter(fn)
  
const isFemale = x =>
  x.sex === 'female'
  
const filterFemaleMembers = filter(isFemale)

console.log(filterFemaleMembers(members))

最好先将 fn 传递给 filter,而不是先将 arr 传递给 filter,因为它在组合函数时有好处:

const members = [
  {name: 'Eminem', sex: 'male'},
  {name: 'Rihanna', sex: 'female', age: 28},
  {name: 'Lana Del Rey', sex: 'female', age: 31}
]

const filter = fn => arr =>
  arr.filter(fn)
  
const compose = f => g => x =>
  f(g(x))
  
const isFemale = x =>
  x.sex === 'female'

const isOlder30 = x =>
  x.age > 30

const isFemaleAndOlder30 = compose
  (filter (isFemale))
  (filter (isOlder30))


console.log(
  isFemaleAndOlder30 (members)
)