如何解决在组合中部分应用函数参数
我正在尝试编写一个函数组合,在每个步骤部分应用一个参数,并最终调用一个柯里化的双参数函数。
有一组示例函数可以组合。我删除了应该做的计算,因为它们与问题无关,但让我们假设每个参数都是必需的。
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 举报,一经查实,本站将立刻删除。