跳转到内容

面向类型编程/有界类型参数

来自维基教科书,开放世界中的开放书籍

考虑以下代码

type Equatable {
  func equals(x Any) Bool
}

type Complex : Equatable {
  property real Float
  property imag Float

  func equals(x Any) Bool {
    if x is Complex then {
      var x = x as Complex
      return self.real == x.real & self.imag == x.imag
    }
    return false
  }
}

type Pair[T] {
  property first T
  property second T
}

main {
  var x = new Complex { real=2.0, imag=3.0 }
  var y = new Complex { real=2.0, imag=3.0 }
  return x.equals(y)
}

我们现在想为Pair实现equals方法

func equals(p Pair[T]) Bool {
  return self.first.equals(p.first) & self.second.equals(p.second)
}

但是请注意,这段代码无法编译,因为编译器无法确定T是否代表可比较类型。我们需要修改Pair的声明为

type Pair[T:Equatable] { ... }

现在,可以确保T是可比较的,并且我们可以检查对等的相等性

main {
  var x = new Complex { real=2.0, imag=3.0 }
  var y = new Complex { real=2.0, imag=4.0 }
  var p1 = new Pair[Complex] { first=x, second=y }
  var p2 = new Pair[Complex] { first=x, second=y }
  return p1.equals(p2)
}

这里,T类型参数称为有界的,因为对其施加了类型约束。

注意:可以使用 Funcy 应用程序尝试此伪代码,该应用程序可以从Apple 的 App Store (iOS/macOS)Google Play (Android)Amazon Appstore免费下载。要执行的代码必须放在main {}块中。

华夏公益教科书