如何在对象身份的上下文中保持 ES2015 代理透明?
How to keep ES2015 proxies transparent in the context of object identity?
我目前正在为 Javascript 开发一个 "plugable",增强的 运行 时间类型系统,以促进无类型环境中的类型导向函数式编程。它本质上是基于 Proxy
虚拟化。代理很棒,尽管它们并不总是透明的:
const xs = [1,2,3];
const xs_ = new Proxy(xs, {});
const s = new WeakSet([xs]);
s.has(xs); // true
s.has(xs_); // false
在 运行 时间内,无论是否有 Proxy
合同,同一对象都可能出现。由于 Javascript 通过引用定义对象标识,因此在将对象与其约定的对应对象进行比较时,代理是不透明的。
因此,在使用代理和对象类型时,我会丢失 WeakMap
/WeakSet
和 ===
运算符。除此之外,我将不得不递归地比较它们的属性,这可能是一个相当昂贵的操作。
在 vanilla Javascript 中是否有一个简单的解决方法来保持代理透明?
因为我猜我的问题的答案是否定的,这里有一个额外的、更一般的答案:
对于纯函数式语言,数据结构的身份似乎是由状态而不是引用来定义的。虽然我知道深度克隆在存在持久数据结构/结构共享的情况下并不重要,但递归值比较似乎与普通 Javascript.
一样昂贵
纯函数式语言如何降低大量数据结构比较的复杂性?
The same object may appear with and without a Proxy contract during run-time.
尽可能避免这种情况。
With purely functional languages the identity of data structures seem to be defined by state rather than by reference.
纯函数式数据结构没有state,它们只有contents :-)
而且与 OOP 不同的是,没有 "identity" 的概念 - 只有相等性,您通常必须自己定义(例如 Haskell 中的 Eq
类型类,尽管编译器可以自动 derive
结构相等算法的实现)。
How do purely functional languages reduce the complexity of extensive data structure comparison?
Hash consing 是一种流行的方法——如果结构由相同的元素构成,它们可以在内存中共享它们的表示。指向同一内存位置的两个值显然是相同的,对于其他所有内容都需要进行默认检查。
有些语言因为不可预测的性能而不这样做,其他语言(不是纯函数式语言)允许程序员使用副作用为他们自己的数据结构实现散列构造。
Apart from that I would have to compare their properties recursively, which may be a rather expensive operation.
是的。比较不便宜。
我目前正在为 Javascript 开发一个 "plugable",增强的 运行 时间类型系统,以促进无类型环境中的类型导向函数式编程。它本质上是基于 Proxy
虚拟化。代理很棒,尽管它们并不总是透明的:
const xs = [1,2,3];
const xs_ = new Proxy(xs, {});
const s = new WeakSet([xs]);
s.has(xs); // true
s.has(xs_); // false
在 运行 时间内,无论是否有 Proxy
合同,同一对象都可能出现。由于 Javascript 通过引用定义对象标识,因此在将对象与其约定的对应对象进行比较时,代理是不透明的。
因此,在使用代理和对象类型时,我会丢失 WeakMap
/WeakSet
和 ===
运算符。除此之外,我将不得不递归地比较它们的属性,这可能是一个相当昂贵的操作。
在 vanilla Javascript 中是否有一个简单的解决方法来保持代理透明?
因为我猜我的问题的答案是否定的,这里有一个额外的、更一般的答案:
对于纯函数式语言,数据结构的身份似乎是由状态而不是引用来定义的。虽然我知道深度克隆在存在持久数据结构/结构共享的情况下并不重要,但递归值比较似乎与普通 Javascript.
一样昂贵纯函数式语言如何降低大量数据结构比较的复杂性?
The same object may appear with and without a Proxy contract during run-time.
尽可能避免这种情况。
With purely functional languages the identity of data structures seem to be defined by state rather than by reference.
纯函数式数据结构没有state,它们只有contents :-)
而且与 OOP 不同的是,没有 "identity" 的概念 - 只有相等性,您通常必须自己定义(例如 Haskell 中的 Eq
类型类,尽管编译器可以自动 derive
结构相等算法的实现)。
How do purely functional languages reduce the complexity of extensive data structure comparison?
Hash consing 是一种流行的方法——如果结构由相同的元素构成,它们可以在内存中共享它们的表示。指向同一内存位置的两个值显然是相同的,对于其他所有内容都需要进行默认检查。
有些语言因为不可预测的性能而不这样做,其他语言(不是纯函数式语言)允许程序员使用副作用为他们自己的数据结构实现散列构造。
Apart from that I would have to compare their properties recursively, which may be a rather expensive operation.
是的。比较不便宜。