微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在组合中部分应用函数参数

如何解决在组合中部分应用函数参数

我正在尝试编写一个函数组合,在每个步骤部分应用一个参数,并最终调用一个柯里化的双参数函数

有一组示例函数可以组合。我删除了应该做的计算,因为它们与问题无关,但让我们假设每个参数都是必需的。

const getDayLimit = () => {
  return 10
}

const getIpCount = ip => dayLimit => {
  return 99
}

const getIp = (deviceid,headerIp) => {
  // Todo: use Result monad to handle errors
  if (!deviceid && !headerIp) {
    throw new Error('Ip not provided')
  }
  return deviceid || headerIp
}

和组合尝试:

const validateIp = R.compose(
  f => f(getDayLimit()),getIpCount,getIp
)

validateIp(1,2)

在第一步中,getIp 收到两个值并基于它们返回一个 ip,然后部分应用于 getIpCount,现在组合返回一个需要 dayLimit 参数的函数需要先计算。

执行此操作的简单方法可能是:f => f(getAccountLimit())。 我想删除这样的函数创建 f => f... 并通过它无点。

这里有一个辅助函数可以解决这个问题,但不能处理所有情况,例如将参数传递给 result 函数

const applyResult = result => f => R.compose(f,result)()

然后我可以这样做:

const result = R.compose(
  applyResult(getDayLimit),getIp
)

这对我来说似乎太hacky了,对我的进一步使用来说意义不大。我宁愿避免为此类问题编写自己的辅助函数

在将参数部分应用于函数之前,是否有一种计算参数的函数方法?在我看来,这似乎是一个非常普遍的案例,尽管我可能没有正确考虑这个问题。

我对这个问题和函数组合的想法有误吗?

在组合中使用具有两个参数的函数处理这种情况的好方法是什么?

可以在函数组合中处理每个步骤部分应用函数参数的情况吗?

谢谢!

解决方法

我想我会使用一个延续,据我所知,它代表一个被中断的计算:

const cont = x => f => f(x);

通过延续,你会在 f 之前得到 x。你做的不是f(x),而是cont(x)(f),它在幕后只是为你做f(x)

在将函数组合在一起时,您已经知道 x 的值,即 getDayLimit(),您只是不知道 f 的值,只有在result 应用于前两个初始参数。

所以这就是我要做的:

const result = R.compose( cont(getDayLimit()),getIpCount,getIp);

在将参数部分应用于函数之前,是否有一种计算参数的函数式方法?

我只是注意到你将一个函数应用于一个值(而不是相反)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。