问题标签 [structural-equality]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4222 浏览

f# - F# 中的结构平等

我有一个包含函数的记录类型:

我希望这种类型具有结构平等。有什么方法可以标记bar在平等测试中应该被忽略吗?或者还有其他方法可以解决这个问题吗?

0 投票
1 回答
341 浏览

dictionary - 二维数组的 IEqualityComparer 实例

F# 支持二维数组与=运算符的结构相等性,以及在 F# 集合(如Set. 但是如何在 .NET 类中使用相同的相等比较HashSet呢?默认情况下,它使用引用相等,尽管有一个构造函数采用IEqualityComparer<T>I 的实例,但无法找到适合二维数组的内置实例。

我看了看System.Collections.StructuralComparisons.StructuralEqualityComparer,但这似乎有两个问题。首先,它不是通用的,其次,它似乎不支持二维数组:

最终,我想修复以下代码,使其返回 1,而不是 2:

我也会对使用 的解决方案感到满意Dictionary,但我认为同样的问题也适用。

0 投票
4 回答
820 浏览

c# - 实施 IEquatable当 T 可以是 IEnumerable

我已经阅读了与我类似的各种问题,但似乎都没有解决我的问题。

我有这样的类型:

什么时候T是一个标量,因为MyObject<int>平等工作正常,但是当我定义类似MyObject<IEnumerable<int>>平等的东西时失败。

原因是当 T 是IEnumerable<T>我应该调用this.Value.SequenceEqual(other.Value).

使用类型检查和反射的 LOC 来处理这种差异会膨胀Equals(MyObject<T>)(对我来说,这会导致违反 SOLID/SRP)。

我无法在 MSDN 指南中找到这个特定案例,所以如果有人已经遇到过这个问题;如果可以分享这些知识,那就太好了。

编辑:替代

对于 KISS,我想知道做类似的事情:

这样实现起来Equal就会简单很多。当我只需要一个值时,我会收集 1 个项目。显然 T 不会是可枚举的(但数据结构是私有的,所以没有问题)。

0 投票
1 回答
221 浏览

tree - 如何在合金中表达树木之间的结构平等?

我定义了以下合金模型,它使用单个 State 对象指向两棵树的根,State.a并且State.b.

在我得到的解决方案中:

所以我得到了两棵树N2 -> N0N3 -> N1它们在结构上是相等的。

我怎样才能进一步约束这个模型,以便在这个意义State.aState.b 不相等?

恐怕这只能通过递归谓词来完成,并且递归只能达到深度 3 的限制(我认为)。

因此,如果可能的话,我倾向于使用非递归解决方案。

0 投票
2 回答
137 浏览

.net - IStructuralEquatable 对象的稳定哈希码

我需要构建一个对象的稳定(= 不随时间变化)哈希码。具体来说,我不知道对象的确切类型。我做的唯一假设是它继承自 IStructuralEquatable。

所以我需要一个方法:

.Net 框架提供这种类型的功能?否则,使用哪种算法?

0 投票
1 回答
104 浏览

.net - 有什么方法可以影响 F# 编译器为结构相等而生成的代码?

这是一个具体的例子。我有一个带有浮点字段的记录类型,我希望能够比较这种类型的实例是否相等,但是当然编译器生成的结构相等和比较的默认实现不考虑浮点不精确,所以你可以在比较中得到误报和否定。

在我的应用程序中,我有很多记录,每个记录都有很多浮点字段。如果我可以在我的浮点字段或整个记录上添加一个“精度位数”属性,这将是一件好事,以告诉编译器使用这么多位精度来比较浮点值是否相等。我可以覆盖 Equals、GetHashCode 和 IComparable.CompareTo,但它需要大量的输入和繁重的维护负担。

我猜另一个选项是代码生成器工具,可以为我吐出所有这些覆盖。

0 投票
1 回答
1120 浏览

c# - 数组的结构比较

在 F# 中:

通常在 C# 或 .NET BCL 中:

为什么?


后记:

我认为我有“正确的” Equals 的原因是因为事实证明这是真的:

0 投票
2 回答
496 浏览

dictionary - 如何制作 .NET 可变字典在 F# 中使用结构比较和平等

我知道 F# 有 MAP,但我想使用 .NET 字典。这个字典有作为字符串的键和作为 F# 值 + 字典的值,即:

现在,我要解决的问题是如何为 RelationC 类型提供结构平等。如果需要封装实际存储,如何创建一个替代 Dictionary 的容器,将其用于可变操作并具有结构相等性?


使用当前答案,此代码不起作用(诅咒实现不完整,但是,这甚至无法编译):

这是错误:

错误 FS0377:此类型使用了“NoEquality”、“ReferenceEquality”、“StructuralEquality”、“NoComparison”和“StructuralComparison”属性的无效组合 (FS0377)

0 投票
1 回答
681 浏览

algorithm - 如何在结构上深度比较 2 个可能包含循环引用的 lua 表,其中表的键本身可能是表?

这个问题类似于之前发布的问题,How can I deep-compare 2 Lua tables,可能有也可能没有作为键的表?

问题是,那里的解决方案非常适合简单的深度比较。但是,它不能正确处理循环引用。更具体地说,如下:

产生堆栈溢出。如果不是因为堆栈溢出,它可能会产生误报(不是我可以测试的)。

我该如何处理这种情况?(它甚至可以处理吗?当我想到它时,这听起来像是计算机科学中一个未解决的问题......但我对此知之甚少)


当我说“结构平等”时,我的意思是下表:

在结构上与下表不同:

而在“内容平等”中,它们是平等的。


测试用例:

0 投票
1 回答
259 浏览

functional-programming - 什么定义了结构平等?

在结构平等方面,

为什么会(equal? (list 'a 'b))评估为真但(equal? (list 2 'b) '(2 'b))评估为假?