是否可以根据要比较的数据生成相等函数?

问题描述 投票:1回答:1

如果值相同,则两个布尔值相等,两个数字类似。如果两组元素相同,则它们是相等的。如果检查两个集合是否相等,我们可以使用以下方案/球拍功能:

(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。

是否可以生成一个服从以上属性的函数?够了吗?能知道数据的类型有帮助吗?

如果您对如何改善或标记此问题有任何想法,请发表评论。

scheme racket code-generation equals equality
1个回答
1
投票

是的,绝对有可能。一些编程语言允许自动等价函数综合。 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
© www.soinside.com 2019 - 2024. All rights reserved.