如果值相同,则两个布尔值相等,两个数字类似。如果两组元素相同,则它们是相等的。如果检查两个集合是否相等,我们可以使用以下方案/球拍功能:
(define (same-set? l1 l2)
(and (subset? l1 l2) (subset? l2 l1)))
如何自动生成这样的功能?可以为任意数据类型生成吗?
等价关系的基本属性是:
[替换属性:对于任何数量的a和b以及任何表达式F(x),如果a = b,则F(a)= F(b)(如果双方都有意义,即格式正确)。一些具体的例子是:
对于任何实数a,b和c,如果a = b,则a + c = b + c(这里F(x)是x + c);
对于任何实数a,b和c,如果a = b,则a − c = b − c(这里F(x)是x − c);
对于任何实数a,b和c,如果a = b,则ac = bc(这里F(x)是xc);
对于任何实数a,b和c,如果a = b并且c不为零,则a / c = b / c(这里F(x)是x / c)。
自反特性:对于任何数量的a,a = a。对称属性:对于任何数量的a和b,如果a = b,则b = a。传递属性:对于任何数量的a,b和c,如果a = b和b = c,则a = c。
是否可以生成一个服从以上属性的函数?够了吗?能知道数据的类型有帮助吗?
如果您对如何改善或标记此问题有任何想法,请发表评论。
是的,绝对有可能。一些编程语言允许自动等价函数综合。 Swift就是这样的例子。
没有自动综合,开发人员必须为相等性编写代码,例如,考虑一个结构:
struct Country: Equatable {
let name: String
let capital: String
var visited: Bool
static func == (lhs: Country, rhs: Country) -> Bool {
return lhs.name == rhs.name &&
lhs.capital == rhs.capital &&
lhs.visited == rhs.visited
}
}
对于Swift 4.1及更高版本,这不再是必需的。编译器会为您生成相等函数:
struct Country: Equatable { // It's enough to just declare that the type is `Equatable` and the compiler do the rest
let name: String
let capital: String
var visited: Bool
}
让我们测试一下:
let france = Country(name: "France", capital: "Paris", visited: true)
let spain = Country(name: "Spain", capital: "Madrid", visited: true)
if france == spain { ... } // false