Type-oriented programming/Bounded type arguments
Appearance
Consider the following code:
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)
}
We now want to implement the equals method also for Pair:
func equals(p Pair[T]) Bool {
return self.first.equals(p.first) & self.second.equals(p.second)
}
Note, however, that this code won’t compile since the compiler can’t be sure
that T represents an equatable type. We need to change the
declaration of Pair to
type Pair[T:Equatable] { ... }
Now it’s ensured that T is equatable and we can check
pairs for equality:
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)
}
Here, the T type argument is called bounded
since there’s a type constraint placed on it.
NB: The pseudocode can be tried out using the Funcy app, which can be downloaded for free from
Apple’s App Store (iOS/macOS),
Google Play (Android) or Amazon Appstore. The code to be executed must be placed in a main {} block.