我通过反复试验解决了以下问题,但对我的操作方式仍然没有足够的了解。
有一个功能缺点:
const cons = (x, y) => f => f(x, y);
将值存储在变量对中:
const pair = cons(5, 3);
创建两个函数car和cdr,它们每个都将返回各自的参数。
car(pair); // 5
cdr(pair); // 3
我查看了函数的组成和currying,但没有发现与此相似的地方。为了更好地理解该主题,我应该学习什么?
编辑: (解决方案)
const car = pair => pair((x, y) => x);
const cdr = pair =>pair((x,y) => y);
答案 0 :(得分:2)
您可以再选择两个函数,它们返回一个特殊的参数,例如left
和right
,而另外两个函数car
和cdr
则返回参数的调用。关闭。
一种标准的方法是看自己拥有的东西
cons = (x, y) => f => f(x, y)
以及您想要获得的东西
car(pair) // --> x
cdr(pair) // --> y
然后,您需要两个函数来获取x
或y,这需要在cons
和x
上使用闭包y
。
最终决定是使用函数car
和cdr
进行闭包,闭包将返回一个函数,该函数需要函数f
进行调用。
结果是x
或y
的值。
const
cons = (x, y) => f => f(x, y),
left = (l, r) => l,
right = (l, r) => r,
car = fn => fn(left),
cdr = fn => fn(right),
pair = cons(5, 3);
console.log(car(pair)); // 5
console.log(cdr(pair)); // 3