gpt4 book ai didi

javascript - 高阶代理滥用

转载 作者:行者123 更新时间:2023-11-30 09:45:27 25 4
gpt4 key购买 nike

Javascript 声称是一种函数式语言,但它确实不像是一种函数式语言。它缺乏使函数式语言整洁的大部分东西,其中之一就是无点风格。幸运的是我们在 ES6 中得到了箭头函数和代理,所以我决定自己用代理实现点自由风格:

let pfree = ctx => f => new Proxy (f, {
has: (t, p) => p in t || p in ctx
, get: (t, p) => {
let k = p in t? t[p]: ctx[p];

if (k instanceof Function) return (
function fetch (_k) {
return pfree (ctx) ( x => ( q => q instanceof Function
? fetch (q)
: t (q)
) ( _k(x) )
)
})(k);

return k;
}
});

相当头疼,但它完成了工作——在 nodejs 中你可以像这样使用它:

let p = pfree (global) (x => x)

with (p) {
add = x => y => x + y
succ = add (1)
five = succ . add (2) . succ (1)
}

console.log(five) // 5

当您创建高阶函数时会出现问题:

with (p) {
flip = f => x => y => f (y) (x)
Const = a => b => a
dot = f => a => b => f(a(b))
ap = f => g => x => f (x) (g (x))

zero = flip (Const)
succ = ap (dot)

num = n => n (x => x + 1) (0) // The number n is represented by running a function n times over some input

console.log ( num ( succ ( succ ( succ (zero) )))) // 3
console.log ( num . succ . succ . succ (zero) ) // [Function]
}

我真的想不通为什么..

想法?

最佳答案

问题很简单:

succ . add(2)

无法区分

(succ . add) (2)

使用 JavaScript 属性访问规则,但您希望它们做不同的事情。

解决方案是不可能的(我敢说),但您可以通过引入自定义分组运算符来解决:

group(succ . add) (2)

您还应该在分配给 p 的属性时调用它。您应该能够完成以下工作:

addFour = succ . add (2) . succ
five = group(succ . add (2) . succ) (1)
fiveAgain = addFour (1)

console.log ( group(num . succ . succ . succ) (zero) ) // 3

关于javascript - 高阶代理滥用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com